Linux的串口非标准波特率设置更改
用的是全志的R528 SDK,Linux内核是5.4,新增加一个250000的非标准波特率参考网络大神文档,实践并记录宝贵的经验。
方法:
1、修改内核的/include/uapi/asm-generic/termbits.h文件
这个CBAUD原来是0010017改为0030017,是用来做掩码计算的。
图1
这两个是新加的
图2
这个头文件一共更改这三个地方。先说为什么增加波特率使用0020001而不在B4000000后面递增使用0010020,这是因为这个低位的20已经被占用了,
如下图3,所以找了没被占用的位置,0020000的中2这个bit位置在c_cflag中没被占用(c_cflag是用于设置波特率和其他一些信息的)。
第一处的0030017也是这个原因,就是将波特率使用的这些宏定义包含进去。
图3
2、/drivers/tty/tty_baudrate.c文件
这个文件就是获取波特率具体数值的文件,应用端的数据传入到内核,内核解析并获得250k波特率这个数值就是在这个文件,
先在文件
头部的波特率列表中增加所需数值,如图4,其中的250000和B250000为新增加。
图4
修改函数speed_t tty_termios_baud_rate(struct ktermios *termios),图5
图5
其中圈起来的地方是新加的,这就是根据刚才新加的部分进行波特率修改,新的0020001,与CBAUDEX2进行运算判断高位位置,
之所以cbaud+=30是因为前面已经有了30个波特率了,见图5。这样内核就修改完了。
最后重新编译内核, 重新烧录系统镜像。
3、应用程序测试验证
应用端的配置,应用端通常使用tcsetattr这个函数进行配置,在使能之前,对齐c_cflag进行赋值就可
struct termios , termios_new;
termios_new.c_cflag |= 0020001;
(其余配置省略)
tcsetattr(fdcom, TCSANOW, &termios_new);
这里说一下为什么不能使用cfsetispeed、cfsetospeed 函数。
因为这两个函数只能指定原来标准的波特率,设置我们非标准的0020001的时候就会设置失败
//ret = cfsetispeed(&newttys1, 0020001);
//printf("reti = %d\n",ret);
//ret = cfsetospeed(&newttys1, 0020001);
//printf("reto = %d\n",ret);
应用层测试代码
baud_test.c#include#include#include#include #include #include #include #include "uart_oper.h"#define UART1_DEV_NAME"/dev/ttyS1"/*需根据实际端口修改*/#define BUF_LEN 100int main(int argc,char const * argv[]){ int fd =-1,ret =-1; char buff={0}; int i =0; int n =0; int len = BUF_LEN; int baud = 0; if(argc !=2) { printf("arg is not 2\n"); return -1; } baud = atoi(argv); printf("baud =%d\n",baud); fd = open(UART1_DEV_NAME, O_RDWR | O_NOCTTY | O_NDELAY); if(fd < 0) { perror("Can't open uart1 port"); return(void *)"uart1 dev error"; } ret = set_serial(fd,baud, 8, 'N', 1); /*可能需要根据情况调整*/// ret = set_serial(fd, 115200, 8, 'N', 1); /*可能需要根据情况调整*/ if(ret < 0) { printf("set_serial error\n"); return -1; } for(i =0 ;i
页:
[1]