Software Serial - wie synchronisiert man 2 Software Ports bei Datenempfang

Hallo Leute,

ich habe folgendes Problem.
Ich muss 2 Geräte auswerten ( Xbee, Kompass Modul ) welche im Sekundentakt Daten ( beide senden Ascii Strings mit CR am Ende ) senden.
Ich verwende die IDE 1.0.3.

Bei der Softwareserial Lib kann ja nur immer ein Port der aktive sein.
Deshalb setze ich diesen bevor ich ihn abhöre auf myPort.listen() aktiv. Jedoch ist hier das Problem gegeben, dass keine Daten wie beim Hardware Port gebuffert werden.
D.h es kann Datenverlust bestehen ?! oder?

Jetzt habe ich es so gelöst, dass ich wenn ich einen Port auf aktiv setze, diesen für eine bestimmte Zeit mit einer while Schleife für eine Sekunde lang abhöre bzw warte dass er aktiv wird, wenn nicht wird die Schleife abgebrochen. Dass ich nun nicht eine Sekunde unnötig warte, wenn die Daten schon empfangen wurden ( CR empfangen ), frage ich innerhalb der Schleife das CR Zeichen ab, und habe es in meiner Schleifenbedingung als Abbruch definiert.

Es funktioniert zwar, ich finde es aber nicht ganz so elegant.
Gibt es keine Möglichkeit, Daten zu buffern und somit kein unnötiges “Warten” in den Programmablauf einbauen zu müssen?

Oder wäre es in meinem Fall der beste Weg,auf externe Hardware UART Bausteine auszuweichen, falls diese Daten buffern können und dann einfach wieder mit der SoftwareSerial Lib den UART auslese?( keine Ahnung, eventl kann man die UARTs ja auch mit I2C auslesen… )

hier mal einpaar Code Ausschnitte von meinem Sketch

void setup()
{
  Serial.begin(19200);
  Kompass.begin(19200);
  XBee.begin(19200);
  XBee.listen();
  Serial.println("Test Serial");
  XBee.println("Test XBee");
  Kompass.println("Test Kompass");
}
void loop()
{
	if(XBee.isListening())
		checkXbee();
	else
		Serial.println("Xbee not available");
		
	if(Kompass.isListening())
		checkKomp();
	else
		Serial.println("Kompass not available");
		
}


void checkXbee()
{
	long time = micros();
	boolean bCancle = false;
	while((micros()-time) < 1000000 && !bCancle)
	{
		// if(XBee.available()>0)
			// Serial.println("Lese ankommende Daten von XBee ein: ");
		while(XBee.available()>0&& !bCancle)
		{
			char c = XBee.read();
			Serial.write(c);
			if(c == '\r' || c == '\n')
			{
				bCancle =true;
				Serial.println("");
			}
		}
		Kompass.listen();
	}
}


void checkKompass() 
{
	long time = micros();
	boolean bCancle = false;
	while((micros()-time) < 1000000 && !bCancle)
	{
		// if(Scada.available()>0)
			// Serial.println("Lese ankommende Daten von Kompass ein: ");
		while(Kompass.available()>0 && !bCancle)
		{	
			char c = Kompass.read();
			Serial.write(c);
			if(c == '\r' || c == '\n')
			{
				bCancle =true;
				Serial.println("");
			}
		}
	}
	XBee.listen();

}

Der Output im Terminal sieht so aus.

H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,
H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,
H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,
H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,
H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,
H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,
H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,
H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,
H,1,1,1637604,4786467,24410,6,53,4985,124578,no Error
1213,,,,,,,,,,

Der String beginnend mit “H” kommt vom Xbee und die untere Zeile kommt vom Kompass ( bitte die vielen , wegdenken - da dieser String von einem externen selbstgeschriebenen C# Simulator stammt, mit dem ich mir GPS Strings zusammenbastle … )

Ich wäre euch sehr dankbar, wenn ihr mir hier tolle Tipps und Hilfe geben könnts.

lg
Dieter

Vielleicht hilft Dir das weiter, wenn Du drei serielle Schnittstellen gleichzeitig an einem Board nutzen möchtest, das nur eine einzelne Hardware-Serial hat: http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

Es gibt aber auch Arduino-Boards mit mehr als einer Hardware-Serial, z.B. das Arduino MEGA mit vier Hardware-Serials.