在Linux下指定FTDI虚拟串口的非标准波特率

我有一个USB设备,我试图通过ftdi_sio内核模块提供的虚拟串口进行通信。 但是,我有一些麻烦设置端口的波特率为14400:

  • termios.h没有为14400指定常量,所以我不能使用cfsetispeedcfsetospeed
  • 在ftdi_sio内核模块的源代码中,波特基被设置为24000000,似乎没有办法改变它。 这意味着我不能使用TIOCSSERIAL ioctl自定义除数,并以这种方式获得14400波特率。
  • 模块源有一个注释,听起来像设置端口的alt_speed结构的alt_speed成员为14400将做我想要的,但似乎没有任何方法将其设置为14400给定的现有接口。

有没有人有任何想法呢? 通过破解内核模块来解决这个问题是相当容易的,但是我真的在寻找一个不需要更改内核的解决scheme。

你不能改变波特率,我想这是硬件相关的。 所以搞乱模块不会对你有好处。 在第三点中,您只讨论设置自定义波特率的第一种方法,您需要访问tty->alt_speed 。 看来没有接口可以直接从用户空间设置tty结构,至少不能用ftdi_sio驱动。
但是,在评论中还有另外一种方法:

  * 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 

你试过了吗?

Shodanex的解决方案可以在Linux下使用NDI Polaris Spectra(波特率1.2mbps)。 如指定,用B38400打开串口设备(/ dev / ttyUSB0)

 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); 

然后执行:

 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); }