Luther B. schrieb:
> würde daher zuerst mal darauf tippen, daß daß der µC in Wirklichkeit
> '\r\n' am Zeilenende sendet und daß für /dev/ttyUSB das 'OCRNL' Flag
> aktiv ist (das übersetzt \r nach \n, was unter meiner Annahme zur
> Duplizierung führen würde).
Du meinst ICRNL, nicht OCRNL, denn schließlich nimmt der PC die Zeichen
als Eingabe entgegen. Ausgegeben wird ja offenbar auf /dev/ttyUSB
nichts.
Erklärung: Wenn der µC ein \r\n schickt, wird wegen ICRNL das erste
Carriage-Return in \n verwandelt. Der PC sieht dann: \n\n.
@TO: Ja, Du musst /dev/ttyUSB in den Raw-Mode versetzen, sonst werden
diverse Zeichen vom TTY-Driver gemapped. Google mal nach "tty raw mode"
bzw. nach "man termios".
Gib mal ein der Shell ein:
und poste hier den Output.
Folgende Input flags sollten mindestens gelöscht werden:
c_lflag: ISIG, ICANON, ECHO
c_iflag: ICRNL
Desweiteren solltest Du noch VMIN auf einen vernüftigen Wert setzen,
z.B. 1. VTIME sollte auf 0, damit der Input blockiert, wenn keine
Zeichen empfangen werden.
Danach wirst Du \r\n als Zeilentrenner erhalten, also weiterhin 2
Zeichen und nicht eines. Wenn Du damit leben kannst, ist das okay.
Schließlich hast Du dann eine Datei, wie sie auch Windows oder DOS
speichern würden, da sie immer \r\n als Zeilentrenner in einer
Text-Datei verwenden. UNIX/Linux benutzt nur \n, kann aber mit
Windows-kompatiblen Dateien durchaus umgehen.
Wenn Du nur \n empfangen willst, musst Du das auf dem µC anpassen, indem
Du das Senden von \r unterbindest, also nur das '\n' sendest. Oder Du
änderst Deine simple read-write-Schleife derart ab, dass Du das \r auf
dem PC herausfilterst:
1 | while (nrd = read(fd,buffer,1))
|
2 | {
|
3 | if (nrd > 0 && buffer[0] != '\r')
|
4 | {
|
5 | write(fd1,buffer,nrd);
|
6 | }
|
7 | }
|
Wenn Dich hier stört, dass die Zeichen zeichenweise einzeln auf die
Datei geschrieben werden, hier der Tipp: Nutze für Datei-I/O möglichst
die stdio-Lib, also fopen/fputc statt open/write. stdio ist im Zweifel
immer effizienter, als Du es mit open/write sein kannst, da es an das
System angepasste Buffer-Strategien nutzt. Du kannst mit stdio immer
guten Gewissens die Zeichen einzeln auf die Datei schreiben. Die
stdio-Lib mapped das automatisch in Block-IO (z.B. in 1K-Blöcke). Falls
Dich die größeren Blöcke jedoch wieder stören: "man fflush"
Es gibt also jede Menge Möglichkeiten.