Frage

Ich habe eine Anwendung geschrieben, die serielle Ports unter Linux verwenden muss, insbesondere auf TyusB. Lesen und Schreibvorgänge werden mit Standard -Select ()/Read () Schleifen und Schreiben () durchgeführt, und es ist wahrscheinlich nichts Falsches daran, aber der Initialisierungscode (oder das Fehlen eines Teils davon) schädigt etwas im TTY -Subsystem. Hier ist es:


  vuxboot(string filename, unsigned baud = B115200) : _debug(false) {
    _fd = open(filename.c_str(), O_RDWR | O_NOCTTY);
    if(_fd < 0) throw new io_error("cannot open port");

    // Serial initialization was written with FTDI USB-to-serial converters
    // in mind. Anyway, who wants to use non-8n1 protocol?

    tcgetattr(_fd, &_termios);

    termios tio = {0};
    tio.c_iflag = IGNPAR;
    tio.c_oflag = 0;
    tio.c_cflag = baud | CLOCAL | CREAD | CS8;
    tio.c_lflag = 0;

    tcflush(_fd, TCIFLUSH);
    tcsetattr(_fd, TCSANOW, &tio);
  }

Andere tcsetattr(_fd, TCSANOW, &_termios) sitzt im Destruktor, aber es ist irrelevant.

Mit oder ohne diese Termios -Initialisierung passieren seltsame Dinge im System Nach dem Ausgang des Antrags. Manchmal schlicht cat (oder hd) Das Drucken von nichts oder gleichem Drucken jedes Mal, manchmal wartet es und zeigt keine der Daten an, die sicherlich an den Port gesendet werden. und close() (read() auch, aber nicht jedes Mal) emittiert ein seltsames WARNING nach dmesg Bezogen auf USB-serial.c.

Ich habe die Hardware- und Firmware -Male (sogar auf verschiedenen Maschinen) überprüft und bin sicher, dass sie wie beabsichtigt funktioniert. Darüber hinaus habe ich die Firmware ausgezogen, um die gleiche Nachricht immer wieder zu drucken.

Wie kann ich einen seriellen Port verwenden, ohne etwas zu zerstören? Vielen Dank.

War es hilfreich?

Lösung 5

Okay. Dies ist vielleicht keine perfekte Lösung ... es ist definitiv nicht. Ich habe gerade den FT232-Konverter ausgegeben (gebraten es tatsächlich) und verwendet CP2102-basierte. Es funktioniert jetzt nur (und ist auch 6 -mal billiger).

Andere Tipps

Treffer a WARN_ON Linie könnte Bedeutet, dass Sie einen Kernel -Fehler getroffen haben. Ich weiß, dass es in letzter Zeit viel daran gearbeitet hat, den USB-Serialfahrer zu verbessern. Ich schlage vor, einen neueren Kernel auszuprobieren und/oder auf der Mailingliste linux-usb@vger.kernel.org zu fragen.

Ich bin mir nicht sicher, was mit Ihrem Code -Snippet dort falsch ist, aber dies könnte nützlich sein, wenn Sie es noch nicht gesehen haben: Serienprogrammierhandbuch für POSIX -Betriebssysteme

Ich musste vor kurzem einige serielle Port -Schnittstellen machen und Diese Bibliothek funktioniert gut, das könnte als ein weiteres Beispiel dienen.

Wie auch eine Randnotiz, Ihre Fehlerprüfung open Stimmt nicht ganz - Fehlerbedingungen werden durch einen Rückgabewert von -1 signalisiert. (0 ist eine perfekt gültige FD, die normalerweise mit Stdin verbunden ist.)

Vielleicht möchten Sie es versuchen:

  vuxboot(string filename, unsigned baud = B115200) : _debug(false) {
    _fd = open(filename.c_str(), O_RDWR | O_NOCTTY);
    if(_fd < 0) throw new io_error("cannot open port");

    // Serial initialization was written with FTDI USB-to-serial converters
    // in mind. Anyway, who wants to use non-8n1 protocol?

    tcgetattr(_fd, &_termios);

-   termios tio;
+   termios tio;
+   memcpy(&tio, &_termios, sizeof(struct termios)); 

    tio.c_iflag = IGNPAR;
    tio.c_oflag = 0;
    tio.c_cflag = baud | CLOCAL | CREAD | CS8;
    tio.c_lflag = 0;

    tcflush(_fd, TCIFLUSH);
    tcsetattr(_fd, TCSANOW, &tio);
}

Dies macht es so, dass unerwartete Felder von termios In Ihrem System erhalten Sie etwas vernünftige Werte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top