作为铁路院校毕业的学生,难免和铁路设备打交道。机车安全信息综合检测装置(简称TAX箱)就是这样一个奇葩的设备,数据输出的波特率为28800.而通用的串口波特率设置方法并没有配置成这个波特率的方法。没有办法,只能查资料。各种搜索引擎尝试了之后,发现也有同僚遇到这种问题,但是基本所有的搜索条目都指向了同一个帖子,或者其复制品。而这个帖子只给出了思路和部分代码,没有给出可运行的程序,无奈,只能自己去尝试,去修改,去完善,最终成功搞定,记录一下,供后来人使用,如需转载,请注明出处,谢谢。
对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和ioctl(fd, TIOCSSERIAL, p)的配合,ioctl的最后一个参数是struct serial_struct *类型,在linux/serial.h中定义。其中baud_base是基准晶振频率/16,通常是115200,你需要设的是custom_divisor这个值,最终的波特率为baud_base/custom_divisor,比如你需要28800,因为115200/4=28800,所以要设置custom_divisor=4,。
具体过程为,先设置波特率设为38400(tcsetattr),然后用TIOCGSERIAL得到当前的设置,将flags设置ASYNC_SPD_CUST位,设置custom_divisor,最后用TIOCSSERIAL设置。
使用setserial其实就是利用上述方法,来设置baud_base, custom_divisor等, 其内部实现就是使用ioctl来进行设置。
网上的东西真的是参差不齐,希望能呈现完善的正确的Blog给大家。附代码如下,如有疑问,欢迎留言讨论。由于是测试代码,只是保证可以运行。另外推荐一个串口调试助手AccessPort,可以提供28800的串口比特率作为测试。