Serielle Schnittstelle liest teilweise falsche Frames

Hallo zusammen,
Ich hab ein Leonardo Board welches ich über eine Serielle Schnittstelle mit einer Bedieneinheit verbinden möchte.
Die Grundkonfig zur Schnitstelle sind: 8N2, Baudrate: 9600, keine Flusssteuerung.
Tx der Bedieneinheit ist invertiert.

Daten konnte ich über die SerialHardware und SoftSerial Schnittstelle bereits erfolgreich senden.(nicht invertiert).
Da, wie gesagt, Tx an der Bedieneinheit invertiert ist, hab ich heute einfach eine SoftSerial Schnittstelle erstellt und invertiert.

Daten kann ich empfangen nur sind dies nur zur hälfte plausibel, bedeutet:
Wenn ich die Bedieneinheit einschalte, erwarte ich eigentlich ein Frame von
10 02 79 38 10 03 D6 erhalte allerdings:
10 02 79 38 10 03 AC

Oder bei einem anderen Paket sollte eigentlich dies ankommen:
10 02 79 FF 10 03 9D erhalte stattdessen
10 02 79 FF 20 0D D4 FE

Baudrate ist richtig eingestellt.
Wie gesagt, senden an die Bedieneinheit kann ich auch, die Daten werden von der Einheit richtig verarbeitet.

An was kann es liegen das die letzten Bytes nicht richtig gelesen werden?
Kann man am Mikrocontroller noch was einstellen?
Bin echt ratlos :frowning:
Oszilloskop hätte ich zur Verfügung falls dies was helfen würde...?
Bin für jede Hilfe dankbar!

Beste Grüße
Alex

Logikanalyser würde ausreichen. Probier aber erst einmal die AltSoftSerial aus. Die NewSoftwareSerial bzw SoftwareSerial ist nicht zu gebrauchen bei solchen Baudraten.

hm, newSoftSerial hab ich schon ausprobiert, AltSoftSerial wollte ich auch testen aber wie invertiere ich da denn??

Was bedeutet

Tx der Bedieneinheit ist invertiert.

Hast Du keine TTL Level serielle Schnittstelle sondern RS232 ??

Grüße Uwe

Nein ist kein RS232.
0-5V jedoch soll die Logik invertiert sein.

Wenn ich im Ruhezustand am Board messe, dann hat Pin Rx = 0V und Tx = 5V.
Die Invetierung möchte ich noch durch eine OpenKollector Schaltung lösen.

NewSoftSerial braucht man nicht extra. Das wurde vor etlichen Versionen in die Arduino Software übernommen.

AltSoftserial hat zwar einen speziellen Konstruktor für Rückwärtskompatibilität mit NewSoftSerial, der auch einen Parameter für Invertierung hat, aber damit wird dann nichts gemacht. Seltsam :s

Das könnte man aber auch in Hardware invertieren.

So ich hab mal den Code angehängt, vielleicht ist ja doch irgendwas falsch daran…

SoftwareSerial SerialS(10, 11,true); // RX, TX

void setup()
{
	SerialS.end();
	SerialS.begin(9600);
	Serial.begin(9600);
	while (!Serial) {}

}


void loop(){
	readSerial1();
}
	
void readSerial1(){	
		memset(iFrameIN, 0, sizeof(iFrameIN));
		
		if (SerialS.available()>(sizeof(iFrameIN)-1)){
			
			for (int i = 0; i < sizeof(iFrameIN)+1 ; i++) { 
				iFrameIN[i] = (int)SerialS.read();
			}

			//Ausgabe an Serial (Debug)
			Serial.print("iFrameIN: ");			
			for (int i = 0; i < sizeof(iFrameIN)+1 ; i++) { 			
				Serial.print(" ");
				Serial.print(iFrameIN[i],HEX);
				Serial.print(" ");	
			}

		Serial.print("\n");
		}
}

Hab das ganze jetzt mal hardwaretechnisch invertiert. und so funktioniert es am Serial und SoftSerial port.
Kurzum scheint die Invertierung der SoftserialSchnittstelle Schrott zu sein bzw zu langsam oder was auch immer...

Hallo,

Probier mal Arduino IDE 1.0.6. Mit der Beta 1.5.8 ist die SoftSerial viel ungenauer geworden. Möglicherweise wurde dieser Nachteil auch in die 1.6.x Übernommen. Müßte man gelegentlich probieren / vergleichen / nachmessen.

Christian