如何在Linux上的串口设备上设置非标准波特率?

时间:2013-10-18 01:49:16

标签: linux serial-port tty

在Linux上设置自定义波特率的方法有哪些?

这个问题的答案必须是在系统调用级别之上的用户级低级API(ioctl等)的级别。它至少应该在这些情况下有用:

  1. 编写使用串行端口的低级基于C的用户态代码

  2. 编写抽象串口功能的库,

  3. 编写内核串口驱动程序。

1 个答案:

答案 0 :(得分:5)

不幸的是,事情依赖于驾驶员。好的驱动程序将实现以下所有方法。坏驱动程序只会实现一些方法。因此,你需要尝试所有。以下所有方法都在linux/drivers/tty/serial/serial_core.c中的辅助函数中实现。

  1. 标准波特率在tty->termios->c_cflag

  2. 中设置
  3. 对于230400和460800的比率(根据源代码评论,这是内核开发人员希望死的不推荐的hack):

    • tty->termios->c_cflag速度设置为B38400

    • 调用TIOCSSERIAL ioctl和(struct serial_struct)设置如下:

      serial->flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP]
      

      这为HI设置了替代速度:57600,VHI:115200,SHI:230400,WARP:460800

  4. 如果这些还不够,您可以使用alt_speed设置任何速度,如下所示:

    • tty->termios->c_cflag速度设置为B38400

    • tty->alt_speed中设置目标速度。 alt_speed==0

    • 时会被忽略
  5. 您也可以通过设置自定义除数来设置波特率,如下所示

    • tty->termios->c_cflag速度设置为B38400

    • 调用TIOCSSERIAL ioctl和(struct serial_struct)设置如下:

      serial->flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
      serial->custom_divisor = serial->baud_base / your_new_baudrate
      

    您需要先致电baud_base ioctl获取TIOCGSERIAL