Hallo, ich möchte unter Linux Daten über die serielle Schnittstelle empfangen. Grundsätzlich funktioniert das auch, allerdings verliere ich Zeichen, und zwar werden gehen immer exakt dieselben Zeichen verloren. Mit HTerm wird alles korrekt empfangen. Die Daten haben folgendes Muster: "Zähler" & "8Bit Daten" & "8Bit Daten", also 00 DD DD 01 DD DD 02 DD DD 03 DD DD 04 DD DD ... Verloren gehen dabei immer die Zählerwerte 03, 1A und 1C, alles andere wird jedesmal korrekt empfangen. Nachdem ich die serielle Schnittstelle geöffnet und initialisert habe, lese ich die Daten byteweise in ein unsigned char-array ein, bis eine bestimmte Stopsequenz empfangen wurde. Die Empfangsroutine ist nur ca. 10 Zeilen lang und irgendwas habe ich verhunz, aber ich weiß nicht was.
1 | // Set the baud rates to 19200...
|
2 | cfsetispeed(&options, B9600); |
3 | cfsetospeed(&options, B9600); |
das ist schon korrekt, oder?
Markus schrieb: > Verloren gehen dabei immer die Zählerwerte 03, 1A und 1C, alles andere > wird jedesmal korrekt empfangen. Probier mal
1 | fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY | O_BINARY); |
Ist wahrscheinlich nicht der Grund für Dein Problem ... aber. Du initialisierst byte_counter mit 0. Wenn ein Zeichen empfangen wurde wir byte_counter erhöht. Auch wenn kein Zeichen empfangen wurde, also byte_counter noch auf 0 oder 1 oder 2 steht, fragst Du "if .... ((result_string[byte_counter-1] ... result_string[byte_counter-3]" ab. Könnte Probleme geben.
> // Set the baud rates to 19200... > cfsetispeed(&options, B9600); > cfsetospeed(&options, B9600); > das ist schon korrekt, oder? Ja, die 19200 im Kommentar ist falsch, die Übertragung funktioniert prinzipiell, da mit HTerm alles korrekt empfangen wird. >Probier mal >fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY | O_BINARY); Ist bei mir definiert. Ich zitiere mal aus einem anderen Forum: >>I have included fcntl and stat and types.h >>but still it showing undefined O_BINARY............... >Because it's an undefined constant. For hopefully the last time: >UNDER UNIX THERE IS NO DIFFERENCE BETWEEN TEXT AND BINARY FILES. Scheint also unter Linux nicht zu existieren?
"Ist bei mir NICHT definiert." muss das antürlich heißen.
NurEinGast schrieb: > Auch wenn kein Zeichen empfangen wurde, also byte_counter noch auf 0 > oder 1 oder 2 steht, fragst Du > "if .... ((result_string[byte_counter-1] ... > result_string[byte_counter-3]" > ab. > > Könnte Probleme geben. Danke für den Hinweis. Habe noch ein if (byte_counter > 2) hinzugefügt. War aber leider nicht die Ursache.
Markus schrieb: >>Because it's an undefined constant. For hopefully the last time: >>UNDER UNIX THERE IS NO DIFFERENCE BETWEEN TEXT AND BINARY FILES. > > Scheint also unter Linux nicht zu existieren? Oh. OK Ich hab "Linux" überlesen. Ich denke trotzdem, dass das Problem irgendwo in dieser Ecke angesiedelt ist im ASCII Code ist 0x03 Ctrl-C ETX (End of Text) 0x1C Ctrl-\ FS 0x1A Ctrl-Z SUB cfmakeraw könnte etwas zur Lösung beitragen
Genial! Ich glaub das wars. Vielen, vielen Dank, Karl Heinz. Ich bin so unbeschreiblich happy gerade, ich hab schon so viele Stunden rumprobiert und war echt schon am verzweifeln. Ich dachte O_NOCTTY wäre genug... Nochmal vielen Dank.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.