Domanda

Ho un dispositivo USB che sto cercando di comunicare con più di una porta seriale virtuale fornita dal ftdi_sio kernel modulo. Comunque, sto avendo qualche problema impostando la velocità di trasmissione della porta a 14400:

  • termios.h non specifica una costante per 14400, quindi non posso usare cfsetispeed e cfsetospeed.
  • Nella sorgente del kernel ftdi_sio modulo di base di trasmissione viene impostata a 24 milioni e non sembra essere un modo per cambiarlo. Ciò significa che non è possibile utilizzare un divisore personalizzato con l'ioctl TIOCSSERIAL e ottenere una velocità di 14400 baud in quel modo.
  • La fonte modulo ha un commento facendo sembrare l'impostazione del membro alt_speed della struttura tty_struct per la porta da 14400 sarebbe fare quello che voglio, ma non sembra essere un modo per impostare a 14400 data l'esistente interfacce.

Qualcuno ha qualche idea su questo? Sarebbe abbastanza facile da risolvere questo problema l'hacking il modulo del kernel, ma sono davvero alla ricerca di una soluzione che non richiede modifiche del kernel.

È stato utile?

Soluzione

Non è possibile modificare base di baud, suppongo sia hardware. Così scherzi con il modulo non farà nulla di buono. Nel suo terzo punto si parla solo il primo metodo proposto per impostare una velocità di trasmissione su misura, in cui è necessario accedere al tty->alt_speed. Sembra che non v'è alcuna interfaccia per direttamente insieme struct tty dallo userspace, almeno non con il driver ftdi_sio.
Tuttavia, c'è un altro metodo spiegato nei commenti:

     * 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

Hai provato esso?

Altri suggerimenti

opere di soluzioni di Shodanex con un NDI Polaris Spectra (1.2Mbps baud) sotto Linux. Come specificato, aprire il dispositivo seriale (/ dev / ttyUSB0) con 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);

quindi eseguire:

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); 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top