翼度科技»论坛 云主机 LINUX 查看内容

Linux的串口非标准波特率设置更改

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
用的是全志的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的时候就会设置失败
  1.        //ret = cfsetispeed(&newttys1, 0020001);
  2.             //printf("reti = %d\n",ret);
  3.             //ret = cfsetospeed(&newttys1, 0020001);        
  4.             //printf("reto = %d\n",ret);
复制代码
 
应用层测试代码
[code]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[BUF_LEN]={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[1]);    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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具