Datenübertragung Windows <-> Linux

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
rksteve
Beiträge: 716
Registriert: 11.09.2003 12:24:53
Kontaktdaten:

Datenübertragung Windows <-> Linux

Beitrag von rksteve » 26.10.2005 13:57:22

Hallo!

Ich habe mir einen Microcontroller gebaut der Daten aufzeichnet und über RS232 auf den Linux-Rechner überträgt. Der Microcontroller schreibt mittles printf("Text\n"); Text an die RS232. Jetzt ist es aber so dass das Zeilenende mit CR,LF beendet wird. Das Linuxprogramm das die RS232 mittels read( port, rx_buf[0], 1) liest interprettiert das CR,LF als 2 Zeilenvorschübe.

Code: Alles auswählen

Als Ergebin erhalte ich:
Text1

Text2

Text3
schaue ich mir die mitgespeicherten Daten im Hexeditor an sieht man dass am Zeilenende 2 mal 0x0A (also LineFeed) steht. READ liest wohl ein CR auch als LF???. Wie kann ich das Problem umgehen?

Gruss
Steve

nil
Beiträge: 989
Registriert: 08.06.2005 13:28:36

Beitrag von nil » 26.10.2005 14:08:54

Vielleicht hilft es ein wenig:

http://en.wikipedia.org/wiki/Newline

... ziemlich weit unten steht das Problem ein wenig beschrieben und auch eine Lösung ...

matzi
Beiträge: 8
Registriert: 16.10.2005 22:50:01
Wohnort: Weinheim
Kontaktdaten:

Re: Datenübertragung Windows <-> Linux

Beitrag von matzi » 26.10.2005 19:15:47

Moin rksteve,

ich denke nicht, daß read() das Problem ist.
Wie hast du die Logdatei zum schreiben geöffnet?
Welche Funktion verwendest du um die Daten in die Logdatei zu schreiben?

Gruß
matzi

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 26.10.2005 22:01:28

Code: Alles auswählen

...
  read( port, rx_buf[0], 1);
  printf ("%2.2X ", rx_buf[0]);
...
und schon wissen wir, wer der Schuldige ist ;)
Die ttys haben viele Optionen fuer solche Umwandlungen (man termios -> c_iflag ->
ICRNL | INLCR | IGNCR). Wenn der Mikrocontroller niemals binaere Daten senden soll,
koennte man IGNCR setzen; andernfalls darf natuerlich absolut garnichts umgewandelt
werden. In dem Fall (also wenn read nichts umwandelt) geht's aber so aehnlich:

Code: Alles auswählen

...
  do {
    read (port, rx_buf[0], 1);
  } while (rx_buf[0] == '\r');
...
Beware of programmers who carry screwdrivers.

Benutzeravatar
rksteve
Beiträge: 716
Registriert: 11.09.2003 12:24:53
Kontaktdaten:

Beitrag von rksteve » 27.10.2005 09:17:41

naja, fast. printf(...) ist nur für die Ausgabe am Bildschirm zu Testzwecken. In das File schreibe ich mit write. Ich habe mal einen Teil des Codes abgelegt.
http://nopaste.debianforum.de/1452

Genau das wars. Ich hatte versehentlich ein ICRNL anstatt einem IGNCR drinnen. Dann ist für mich auch klar warum ich immer 2 LF bekommen habe. Jetzt funktioniert es jedenfalls so wie ich das will. Schönen Danke für Eure Hilfe.

Gruss
Steve

Antworten