read(2) unter Suse Linux verwandelt 13 (CR) zu 10 (LF)?!

T

tillman

Hallo,
ich spreche mit meinem Programm, das ich unter Suse Linux 9.2 schreibe und betreibe und mit gcc kompiliere, eine RS232 Schnittstelle an, an der ein Tektronix Cable Tester mit SP232 Modul hängt. Es funktioniert alles wunderbar, sowohl Steuerung, als auch das Auslesen der gesammelten Daten. Da der Cable Tester mir pro Datenpunkt einen 13 Bit unsigned integer schickt, wird diese durch das RS232 Prokoll in eine 5 Bit und eine 8 Bit Sequenz zerlegt. Die beiden Zahlen werden von meinem Programm zu einer zusammengefügt. Das Ergebnis passt, bis auf dies:
Wenn die 5 Bit Zahl = 13 sein soll, wird sie zu 10 verwandelt. (In der 8 Bit Zahl kommt ein so geringer Wert nicht zustande, so dass ich das Problem dort nicht beobachten kann.) Wahrscheinlich wandelt read(2) die Zahl 13 (CR) automatisch in das UNIX Zeilenwechselzeichen 10 (LF) um. Dies ist mein erstes "richtiges" C-Programm, ich bin deswegen etwas ratlos. Kann mir irgend jemand diese Vermutung bestätigen bzw. mir kurz aufzeigen, wie ich dieses Verhalten abstellen kann?
Vielen Dank!

#######
Das Problem wurde gelöst, die Beobachtung war richtig, allerdings passiert der Tausch durch den seriellen Treiber. Lösung:
mit tcgetattr bzw. tcsetattr das c_iflag ICRNL deaktivieren (siehe termios manpage). In den unten aufgelisteten Einstellungen für den Port habe ich die Änderung nun eingefügt:

Die Einstellung für den Port:
void set_port(){
extern int fd;
int i,s;
struct termios options;
tcgetattr(fd, &options);/*get current options*/
cfsetispeed(&options,B9600);/*set baud rate for input*/
cfsetospeed(&options,B9600);/*set baud rate for output*/
options.c_cflag |= (CLOCAL |CREAD);/*enable receiver, set local mode*/
options.c_cflag &= ~PARENB;/*no parity, 1 stop bit*/
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;/*mask the character size bits*/
options.c_cflag |= CS8;/*select 8 data bits*/
options.c_cflag |= CRTSCTS; /*enable hardware flow control*/
options.c_lflag &= ~(ICANON | ECHO |ECHOE | ISIG);/*conigured for raw input*/
options.c_iflag &= ~(IXON | IXOFF | IXANY);/*switch off software flow control (XON is not supported by SP232)*/
options.c_iflag &= ~ICRNL; /*switch off CR is changed to NL (LF on UNIX)*/
options.c_oflag &= ~OPOST;/*raw output*/
tcsetattr(fd, TCSANOW, &options);/*set new options for the port*/
puts("Port setted up! Opened at 9600Baud!\n");
//printf("File descriptor: %i\n",fd);
}
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Themen

JBidWatcher: Problem bei loading Auctions in Verbindung mit mySQL

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

NagiosGrapher 1.7.1 funktioniert nicht

Rollei Mini Wifi Camcorder

OpenVPN - Server kann clients nicht erreichen.

Zurück
Oben