www.mikrocontroller.net

Forum: PC-Programmierung Lesen von Serial Port - Zeichenverlust


Autor: Markus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Manoh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  // Set the baud rates to 19200...
  cfsetispeed(&options, B9600);
  cfsetospeed(&options, B9600);
das ist schon korrekt, oder?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:

> Verloren gehen dabei immer die Zählerwerte 03, 1A und 1C, alles andere
> wird jedesmal korrekt empfangen.

Probier mal
  fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY | O_BINARY);

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ist bei mir NICHT definiert." muss das antürlich heißen.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.