Forum: PC-Programmierung Lesen von Serial Port - Zeichenverlust


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Manoh (Gast)


Lesenswert?

1
  // Set the baud rates to 19200...
2
  cfsetispeed(&options, B9600);
3
  cfsetospeed(&options, B9600);
das ist schon korrekt, oder?

von Karl H. (kbuchegg)


Lesenswert?

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);

von NurEinGast (Gast)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

> // 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?

von Markus (Gast)


Lesenswert?

"Ist bei mir NICHT definiert." muss das antürlich heißen.

von Markus (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.