rs232 unter c++ programmieren



  • Hallo,
    ich versuche derzeit, die Waypoints meines Garmins unter Linux (SuSE 9.0) in c++ auszulesen. Ich habe mit demselben Rechner das schon unter DOS (Turbopascal) und Windows (Delphi) erfolgreich programmiert. Unter Linux/c++/Qt4 geht das Programm zwar, bricht aber regelmäßig und reproduzierbar nach dem 58 Datenpaket mit einem Fehler ab. Ein Byte wird falsch gelesen und die Kontrollsumme stimmt dann nicht mehr. Etwa 4500 Bytes sind davor schon erfolgreich übertragen worden. Im 58 Datenpaket wird dann ..64/10/78.. übertragen, der Garmin sendet aber ..64/13/78..
    Die Schnittstelle habe ich mit folgendem Code initialisiert:

    void Hauptformular::initialisiereSchnittstelle()
    {
    struct termios options;

    /* open the port */
    seriell = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY );
    fcntl(seriell, F_SETFL, 0);

    /* get the current options */
    tcgetattr(seriell, &options);

    //keine Parität, kein Stopbit, character Size maskieren, 8Datenbits ++++++bringt nichts
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;

    /* set raw input, 1 second timeout */
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_oflag &= ~OPOST;
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 10; // eine 1 Sekunde reicht

    //Software Flowcontrol abschalten
    options.c_iflag &= ~(IXON | IXOFF | IXANY);; //bringt was +++ Übertragung bricht jetzt nicht mehr beim 19. sondern beim 58. Paket ab

    //Hardware Flowcontrol abschalten //geht zwar hier, bringt aber nichts
    options.c_cflag &= ~CRTSCTS;

    cfsetispeed(&options, B9600); //Baudrate einstellen
    cfsetospeed(&options, B9600);

    /* set the options */
    tcsetattr(seriell, TCSANOW, &options);
    }

    Der Garmin hat keine Flusskontrolle (weder xon/xoff noch Hardware). Wer kann mir helfen??
    Dank im Voraus, Johannes (cjogi)



  • Ist es immer das selbe Paket? Oder bricht er jedes Mal ab, wenn er eine 10 übertragen soll?

    Im letzten Fall könnte irgendwo auf dem Weg etwas falsch codiert worden sein (10 ist '\r', 13 '\n' - daraus setzen sich Zeilenwechsel zusammen).



  • Nein, ich habe im Garmin 486 waypoints, die alle jeweils in einem Paket gesendet werden sollen und verschieden sind. Die 10 ist zuvor schon oft ohne Fehler gesendet worden.
    Joh.



  • Hallo,
    habe etwas rumprobiert und alle Flags so gesetzt, dass die Bearbeitung von CR und LF nicht mehr geschieht, also:

    options.c_iflag &= ~(IXON | IXOFF | IXANY| INLCR| IGNCR| ICRNL);

    Das hat die Lösung gebracht. Es scheint also doch an der Bearbeitung der Zahlen 10 und 13 zu liegen, wie zuwor beschrieben. Warum dann die 10 oder die 13 vorher fehlerlos durchgingen, kann ich nicht sagen.
    Auf jeden Fall herzlichen Dank für den Lösungshinweis.
    Johannes



  • 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.


Anmelden zum Antworten