Allows normal IO pins to be used as bit bashed UART pins
Resources
https://www.arduino.cc/en/Reference/SoftwareSerial
http://arduiniana.org/libraries/newsoftserial/
Example Usage
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 7); // RX=pin #, TX=pin #
//This also works:
//SoftwareSerial mySerial(PA2, PA3); // RX=pin #, TX=pin #
void audio_init (void)
{
//Set the baud rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void tx_packet (void)
{
byte tx_data[4];
mySerial.write("Hello");
tx_data[0] = 0x00;
tx_data[1] = 0x01;
tx_data[2] = 0x02;
tx_data[3] = 0x03;
mySerial.write(&tx_data[0], 4);
}
Receiving Data
Note you can define unlimited software serial ports, but only 1 can be set to receive at a time.
//Enable RX (will occur in background using irq's)
mySerial.listen();
//....
while (mySerial.available() > 0)
{
char data = mySerial.read();
}
//or:
char data = mySerial.read();
if (data != -1)
{
//Byte received
}
Using only 1 pin
Using for RX only
Defining both pins as PA5 on an ATtiny841 and using to receive worked for us.
Compatibility
ATtiny841
RX on pin 2 (RB2) would not work (no explanation found as to why).
RX on pin 5 (PA5) works.
Does SoftwareSerial use hardware timer?
No, see explanation here: https://arduino.stackexchange.com/questions/35032/does-softwareserial-use-hardware-timer
