Byte 10 wird i 13 umgewandelt



  • Hallo.
    Kann mir jemand sagen warum in einer Reihe über serielle Schnittstelle empfangenen Bytes, alle bytes alle mit Wert 10 in 13 umgewandelt werden ?
    Und wenn es an der Konfiguration liegen sollte dann, woran genau ?

    Ich wäre dankbar für eine Antwort auf diese Frage.



  • Der Device-Treiber für die COM-Ports ermöglicht die Umwandlung von Zeichenketten, z.B. das ersetzten von dem Unix-üblichen LF am Zeilenende in CR oder CR+LF. Diese Umwandlung lässt sich getrennt für das Empfangen und das Senden von Zeichen einstellen (oder abschalten).
    Das Ganze geht über die Funktion tcsetattr().

    Mehr dazu (inkl. Beispiel) findest du in der FAQ und in meinem Buch "C und Linux".



  • Danke für die Antwort.
    Ich habe aus versehen c_iflag nicht initialisiert. Jetzt habe ich das wie folgt gemacht:

    term_attr.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
    

    Das Problem umwandlung von 10 in 13 ist verschwunden, dafür werden jetzt alle Bytes mit Wert 13 "gefressen", sprich wenn 10 Bytes gesendet werden darunter eins mit Wert 13 dann werden 9 empfangen.

    Habe ich, bei initialisierung von c_iflag irgendetwas vergessen ?



  • Marcin schrieb:

    term_attr.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
    

    Warum so kompliziert? Mach's doch so einfach wie in dem genannten Beispiel:

    term_attr.c_iflag = 0;
    

    Dann hast Du auf jeden Fall alle Umwandlungsfunktionen ausgeschaltet.



  • Warum so kompliziert?

    Naja ich wollte nicht den Eindruck erwecken,das ich es nicht verstehe was ich da mache, und einfach eine 0 zuweisen, obwohl es in diesem Fall tatsächlich auf eine 0 hinausläuft.



  • Marcin schrieb:

    ..., und einfach eine 0 zuweisen, obwohl es in diesem Fall tatsächlich auf eine 0 hinausläuft.

    Wenn c_iflag=0 ist, sollten aber auch keine CR mehr "verschwinden".



  • sollten aber auch keine CR mehr "verschwinden"

    Aus irgendeinem Grund, tun sie es trotz c_iflag=0.

    Wie ich mittlerweile herausgefunden habe, muss das Problem mit verschwundenen CRs ziemlich tief im System versteckt. Er tritt bei mir dann auf wenn es Kombination aus einem RS232-USB-Converter und GTK gibt. Total rätselhaft dieses Problem.
    Ich habe dieses Problem so umgangen, indem mit clone() ein neuer Prozess gestartet wird, und in diesem neuen Prozess alles was mit Empfang der Daten zu tun hat gemacht wird.
    Seltsamerweise in einem neuen Prozess funktioniert es einwandfrei, CRs Bytes verschwinden nicht.


Anmelden zum Antworten