在Linux上设置自定义波特率的方法有哪些?
这个问题的答案必须是在系统调用级别之上的用户级低级API(ioctl
等)的级别。它至少应该在这些情况下有用:
编写使用串行端口的低级基于C的用户态代码
编写抽象串口功能的库,
编写内核串口驱动程序。
答案 0 :(得分:5)
不幸的是,事情依赖于驾驶员。好的驱动程序将实现以下所有方法。坏驱动程序只会实现一些方法。因此,你需要尝试所有。以下所有方法都在linux/drivers/tty/serial/serial_core.c中的辅助函数中实现。
标准波特率在tty->termios->c_cflag
对于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
如果这些还不够,您可以使用alt_speed设置任何速度,如下所示:
将tty->termios->c_cflag
速度设置为B38400
。
在tty->alt_speed
中设置目标速度。 alt_speed==0
。
您也可以通过设置自定义除数来设置波特率,如下所示
将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
。