Serielle Schnittstelle



  • Hallo !
    Ich suche (unter Linux) seit einiger Zeit einen Fehler in der Datenübertragung mit einer serielle Schnittstelle.

    Das Gerät ist über eine 3 Draht Verbindung (rxd, txd, gnd) an COM1 angeschlossen. Es arbeitet mit 1200Baud 8bit 2Stopbit keine Parität. Ein externer Fehler ist unmöglich, da die Verbindung unter Windows arbeitet.

    Ich verwende (als ROOT) das Programm siehe
    C/C++ Forum :: FAQ - Linux/Unix :: Serielle Schnittstelle ansprechen
    ein Code von <Martin> aus seinem Buch "C und Linux"
    mit den Einstellungen

    if ((fd = open("/dev/ttyS0", O_RDWR)) == -1) {usw}

    term_attr.c_cflag = B1200 | CS8 | CSTOPB | CLOCAL;
    term_attr.c_iflag = 0;
    term_attr.c_oflag = OPOST | ONLCR;
    term_attr.c_lflag = 0;

    Das Programm selbst arbeitet, aber es findet keine Datenübertagung statt.

    Ist in diesen Einstellungen ein Fehler???? Oder fehlen noch welche???

    mfg WinLin



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Bei manchen (vor allem neueren) Kernel-Versionen muss man das Lesen von Zeichen über die Schnittstelle erst freischalten und zwar mit:

    term_attr.c_cflag = B1200 | CS8 | CSTOPB | CLOCAL | CREAD;

    Außerdem solltest du die Geschwindigkeit mit den Funktionen cfsetospeed() und cfsetispeed() setzen. Der Parameter "B1200" im c_cflag allein funktioniert auf manchen Systemen nicht.
    Dein Quelltext sollte also etwa so aussehen:

    # define TERM_SPEED B1200
      ...
      term_attr.c_cflag = TERM_SPEED | CS8 | CSTOPB | CLOCAL | CREAD;
      term_attr.c_iflag = 0;
      term_attr.c_oflag = 0;
      term_attr.c_lflag = 0;
      cfsetospeed(&term_attr, TERM_SPEED);
      cfsetispeed(&term_attr, TERM_SPEED);
      if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
        perror("terminal: tcsetattr() failed");
    

    Dann sollte es funktionieren.



  • Danke für die Hilfe.
    Der fehlende Parameter war CREAD.
    Danach ging alles.
    Mein System ist Kanotix.
    mfg aus Berlin WinLin


Log in to reply