Angeben von Nicht-Standard-Baudrate für FTDI virtuelle serielle Schnittstelle unter Linux
-
02-10-2019 - |
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 nichtcfsetispeed
undcfsetospeed
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 dertty_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.
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);
}