Frage

Ich habe ein USB-Gerät Ich versuche, mit mehr als einer virtuellen vom ftdi_sio Kernel-Modul bereitgestellt seriellen Schnittstelle zu kommunizieren. Allerdings bin ich die Baudrate des Ports 14400 einige Probleme mit Einstellung:

  • termios.h legt nicht eine Konstante für 14400, so dass ich nicht cfsetispeed und cfsetospeed verwenden kann.
  • In der Quelle für die ftdi_sio Kernel-Modul wird Baud Basis 24000000 gesetzt und es scheint nicht ein Weg, um es zu ändern. Dieses Mittel kann ich nicht einen benutzerdefinierten Teiler mit dem TIOCSSERIAL ioctl verwenden und eine 14400 Baud-Rate auf diese Weise erhalten.
  • Das Modul Quelle einen Kommentar macht es klingen wie das alt_speed Mitglied der tty_struct Struktur für den Port 14400 Einstellung würde das tun, was ich will, aber es scheint nicht eine Möglichkeit zu sein, um es angesichts der bestehenden 14.400 zu setzen Schnittstellen.

hat jemand eine Idee dazu? Es wäre ziemlich einfach, dies zu beheben, indem Sie das Kernel-Modul Hacking, aber ich bin wirklich auf der Suche nach einer Lösung, die nicht Kernel-Änderungen erforderlich ist.

War es hilfreich?

Lösung

Sie können nicht Baud Basis ändern, nehme ich es Hardware zusammenhängt. Also mit dem Modul Messing wird dir nicht gut. In Ihrem dritten Punkt sprechen Sie nur über das erste Verfahren zum Einstellen eines benutzerdefinierten Baudraten vorgeschlagen, in dem Sie die tty->alt_speed zugreifen müssen. Es scheint, gibt es keine Schnittstelle direkt Satz tty Struktur von Anwenderseite, zumindest nicht mit dem ftdi_sio Fahrer.
Allerdings gibt es ein weiteres Verfahren in den Kommentaren erklärt:

     * 3. You can also set baud rate by setting custom divisor as follows
     *    - set tty->termios->c_cflag speed to B38400
     *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
     *      follows:
     *      o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
     *      o custom_divisor set to baud_base / your_new_baudrate

Haben Sie versucht es?

Andere Tipps

Shodanex-Lösung arbeitet mit einem NDI Polaris Spectra (Baud 1.2mbps) unter Linux. Wie angegeben, das serielle Gerät öffnen (/ dev / ttyUSB0) mit B38400,

int port = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
tcgetattr(port,&g_initialAtt);// save this to restore later
newAtt=g_initialAtt;
newAtt.c_cflag = B38400 | CS8 | CLOCAL | CREAD; 
cfmakeraw(&newAtt);
tcsetattr(port,TCSANOW,&newAtt);

dann ausführen:

if(ioctl(port, TIOCGSERIAL, &sstruct) < 0){
    printf("Error: could not get comm ioctl\n"); 
    exit(0); 
}
sstruct.custom_divisor = custDiv;
//sstruct.flags &= 0xffff ^ ASYNC_SPD_MASK; NO! makes read fail.
sstruct.flags |= ASYNC_SPD_CUST; 
if(ioctl(port, TIOCSSERIAL, &sstruct) < 0){
    printf("Error: could not set custom comm baud divisor\n"); 
    exit(0); 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top