I've been using hardware Serial1, Serial2, Serial3 on a Mega to communicate with other Arduinos. I have a need to talk to more than 3 (although only infrequently) so I'm trying to figure out how to use the SoftwareSerial library.
I am using Arduino 1.0.5 on Windows 7.
I started with the sketch "Two part receive" example in the softwareSerial library and have left most of the original comments intact:
const char sketch[] = "SoftwareSerialTest_2013aug20MasterE"; // August 2013 by Rick Rantilla
// rev E - keep it as simple as possible
/*
Software serial multple serial test
Receives from the two software serial ports,
sends to the hardware serial port.
In order to listen on a software port, you call port.listen().
When using two software serial ports, you have to switch ports
by listen()ing on each one in turn. Pick a logical time to switch
ports, like the end of an expected transmission, or when the
buffer is empty. This example switches ports when there is nothing
more to read from a port
The circuit:
Two devices which communicate serially are needed.
* First serial device's TX attached to digital pin 2, RX to pin 3
* Second serial device's TX attached to digital pin 4, RX to pin 5
Note:
Not all pins on the Mega and Mega 2560 support change interrupts,
so only the following can be used for RX:
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
Not all pins on the Leonardo support change interrupts,
so only the following can be used for RX:
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
created 18 Apr. 2011
modified 25 May 2012
by Tom Igoe
based on Mikal Hart's twoPortRXExample
This example code is in the public domain.
*/
#include <SoftwareSerial.h>
// software serial #1: TX = digital pin 10, RX = digital pin 11
//SoftwareSerial portOne(10,11);
SoftwareSerial portOne(12,2);
//Sample program is confusing on RX and TX
//From the arduino reference:
//A call to SoftwareSerial(rxPin, txPin) creates a new SoftwareSerial object
// software serial #2: TX = digital pin 8, RX = digital pin 9
// on the Mega, use other pins instead, since 8 and 9 don't work on the Mega
SoftwareSerial portTwo(13,3);
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println(sketch); // so I can always tell what is actually in the Arduino
// Start each serial port
portTwo.begin(9600);
Serial1.begin(9600); // On the Mega, Serial1 is TX pin 18, RX pin 19
portOne.begin(9600);
additionalSoftwarePort(); // x x x x x x x x x x x x x x x x x x x x x
}
void loop()
{
hardwarePort();
firstSoftwarePort();
//additionalSoftwarePort(); // x x x x x x x x x x x x x x x x x x x x x
delay(500); // just to slow the display down
// blank line to separate a cycle
Serial.println();
}
void firstSoftwarePort(void)
{
// By default, the last intialized port is listening.
// when you want to listen on a port, explicitly select it:
Serial.println("one:");
// while there is data coming in, read it
// and send to the hardware serial port:
portOne.listen();
while (portOne.available() > 0) {
char inByte = portOne.read();
Serial.write(inByte);
}
}
void additionalSoftwarePort(void)
{
// Now listen on the second port
Serial.println("two:");
portTwo.listen();
// while there is data coming in, read it
// and send to the hardware serial port:
while (portTwo.available() > 0) {
char inByte = portTwo.read();
Serial.write(inByte);
}
}
void hardwarePort(void)
{
// now for a hardware serial port
Serial.println("hardware:");
// while there is data coming in, read it
// and send to the hardware serial port:
while (Serial1.available() > 0) {
char inByte = Serial1.read();
Serial.write(inByte);
}
}
I've added one hardware Serial1 port to keep it familiar, to see what stops working when and to keep myself sane. As shown here, I have 3 "slave" Arduinos connected from their pins 0 and 1 to appropriate pins on the Mega and have the slaves sending short messages every few seconds. The sketch always passes data from the slave connected to the Serial1 port (pins 18 and 19) to my computer monitor. As written above, the data from softwareSerial portOne also gets passed to my monitor. However, if I play with the two lines that have all the "x"s I get into trouble. If I comment out the call to additionalSoftwarePort() in the setup and place it inside of the main loop, then not only do I NOT get anything from softwareSerial portTwo, but I get nothing from portOne as well. Hardware Serial1 port keeps on humming.
(As another glitch, if I keep both calls to additionalSoftwarePort() in the program it won't compile at all.)
I've made sure my RX and TX pins are correct. I've swapped out the mega's. I've checked I don't have a library of NewSoftSerial stuck in the mix. I've incorporated everything I've found in the forum and on Google to try to get two SoftwareSerial ports to run on the Mega but have run out of ideas.
Thanks in advance for any other leads.