最近工作上需要用到非标波特率187500,以前用单片机的时候都是直接配置寄存器,所以没有觉得有什么区别。现在需要在linux的环境下开发应用程序,发现linux原生并不支持这种特殊的波特率。
打开内核目录下drivers/tty/tty_ioctl.c,可以看到如下两组数组
baud_table[]
和baud_bits[]
的值必须一一对应。baud_bits[]
的成员定义在头文件inclue/uapi/asm-generic/termbits.h
文件中,这里说明一下:这个文件因为有多个,对应到不同的板级目录中,所以我这里的路径不是绝对通用的。
文件中有这么一串宏,就是波特率对应的宏列表了
这里需要注意的是,这些宏参数是8进制的,编辑的时候如果出现超过8的数值编译会报错。
图片末尾的B187500
就是我添加的宏,因为内核中只有用了5个bit来表示波特率(总共32个,去掉2个0波特率,只剩30个),所以我这边只能注释掉原来的B4000000
。至于为什么是5位,我们可以观察一下第一个宏成员CBUAD
的值,八进制的10017
转换成二进制就是1 0000 0000 1111
正好5个1,其中最高位的1由单独的宏CBAUDEX
表示,顾名思义是用来区分标准波特率和拓展波特率的。这样低四位就只能表示15个波特率(0除外)。
我们再研究一下波特率的转换函数tty_termios_baud_rate
,这样基本上就可以知道这些标志位的意义了。
修改好这两个文件以后,我们重新编译内核,再来写APP程序,这里我不贴全部源码了,就贴一处和普通的串口程序不同的地方
测试过后,就可以实现波特率在187500下的串口通信了