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

Diskutiere read(2) unter Suse Linux verwandelt 13 (CR) zu 10 (LF)?! im C/C++ Forum im Bereich Programmieren unter Linux/Unix; 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...

  1. #1 tillman, 19.04.2006
    Zuletzt bearbeitet: 22.04.2006
    tillman

    tillman Grünschnabel

    Dabei seit:
    19.04.2006
    Beiträge:
    1
    Zustimmungen:
    0
    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);
    }
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

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

Die Seite wird geladen...

read(2) unter Suse Linux verwandelt 13 (CR) zu 10 (LF)?! - Ähnliche Themen

  1. Gigabit PCI Ethernet Card welche unter Kernel 3.16 läuft?

    Gigabit PCI Ethernet Card welche unter Kernel 3.16 läuft?: Hallo zusammen Bezüglich diesem Problem habe ich nun eine neue PCI Gigabit Ethernet Card gekauft, jedoch zeigt mit lspci REIN GAR NIX an!! ->...
  2. androis-apps unter Linux ausführen

    androis-apps unter Linux ausführen: Hallo Welche Möglichkeiten habe ich, um unter Linux (Debian) Android-apps (hier ein Spiel *.apk ? ) auszuführen ? Einen Android-emulator hab...
  3. OpenJDK8 unter Debian7.11/sparc64/kernel 3.16 kompilieren

    OpenJDK8 unter Debian7.11/sparc64/kernel 3.16 kompilieren: Hallo zusammen Habe vor das OpenJDK8 unter Debian 7.11 (mit Kernel 3.16.x aus wheezy-backports...) auf meiner Sun Ultra 45 zu kompilieren....
  4. Update auf Apache >=2.4.12 unter Debian Jessie

    Update auf Apache >=2.4.12 unter Debian Jessie: Hi, aufgrund eines Bugs in Apache 2.4 benötige ich zum Deployment von Seafile unter Debian Jessie das Paket apache2 in der Version >= 2.4.12...
  5. Was mache ich falsch? Tiniywm und Mate Install unter OpenBSD

    Was mache ich falsch? Tiniywm und Mate Install unter OpenBSD: Hallo, # make tiny make: don't know how to make tiny Stop in /root/Downloads/tiny/tinywm-1.3 # make tinywm cc -O2 -pipe -o tinywm tinywm.c...