一尘不染

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

linux

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

  • termios.h没有为14400指定常量,因此我不能使用cfsetispeedcfsetospeed
  • 在ftdi_sio内核模块的源代码中,波特率设置为24000000,似乎没有办法更改它。这意味着我无法将自定义除数与TIOCSSERIALioctl 一起使用,从而无法获得14400的波特率。
  • 模块源有一条注释,听起来好像将端口alt_speedtty_struct结构成员设置为14400即可完成我想要的操作,但是鉴于现有接口,似乎没有任何办法将其设置为14400。

有人对此有任何想法吗?通过破解内核模块来解决这个问题非常容易,但是我确实在寻找不需要更改内核的解决方案。


阅读 306

收藏
2020-06-07

共1个答案

一尘不染

您不能更改波特率,我想它与硬件有关。因此,弄乱模块不会对您有任何好处。在您的第三点中,您仅谈论提出的用于设置自定义波特率的第一种方法,您需要在其中访问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

你试过了吗?

2020-06-07