前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LINUX的串口非标准波特率更改

LINUX的串口非标准波特率更改

作者头像
用户9736681
发布2022-12-05 14:15:23
3.6K0
发布2022-12-05 14:15:23
举报
文章被收录于专栏:嵌入式随笔嵌入式随笔

LINUX的库提供的波特率是标准波特率,应用时有时会用到非标准的波特率。以下试验使用的xilinx的zynq7020,linux内核是4.14版本。以增加波特率100k为例。看了一些直接在应用端改的一些方法,已经取消了,所以更改了内核

第一步,内核需要更改两个地方,一是/drivers/tty/tty_baudrate.c,另一个是/include/uapi/asm-generic/termbits.h

先看第二个,这个CBAUD原来是0010017改为0030017,见图1,是用来做掩码计算的。

图1

这两个是新加的,如图2

图2

这个头文件一共更改这三个地方。先说为什么增加波特率使用0020001而不在B4000000后面递增使用0010020,这是因为这个低位的20已经被占用了,如下图3,所以找了没被占用的位置,0020000的中2这个bit位置在c_cflag中没被占用(c_cflag是用于设置波特率和其他一些信息的)。第一处的0030017也是这个原因,就是将波特率即可使用的这些宏定义包含进去。

图3

第二步,更改文件/drivers/tty/tty_baudrate.c,这个文件就是获取波特率具体数值的文件,应用端的数据传入到内核,内核解析并获得100k波特率这个数值就是在这个文件,

先在文件头部的波特率列表中增加所需数值,如图4,其中的100000和B100000为新增加。

图4

修改函数speed_t tty_termios_baud_rate(struct ktermios *termios),图5

图5

其中圈起来的地方是新加的,这就是根据刚才新加的部分进行波特率修改,新的0020001,与CBAUDEX2进行运算判断高位位置,之所以cbaud+=30是因为前面已经有了30个波特率了,见图5。这样内核就修改完了。

第三步,应用端的配置,应用端通常使用tcsetattr这个函数进行配置,在使能之前,对齐c_cflag进行赋值就可

struct termios , termios_new;

termios_new.c_cflag |= 0020001;

(其余配置省略)

tcsetattr(fdcom, TCSANOW, &termios_new);

这样串口波特率即更改为100k,如需其他波特率在头文件处增加,应用端赋值对应数值即可。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档