大学生
最后登录1970-1-1
在线时间 小时
注册时间2019-11-6
|
48火花
本帖最后由 tao_oYMYe 于 2021-3-23 09:17 编辑
在debian 系统下,使用串口2,串口3都试过,使用 gettimeofday 函数,过1000ms 发送一次数据。
问题描述:开机之后,程序发送的数据无法到达串口终端,很多条数据可能只到达一条,没有规律。经过一段时间(时间不确定,一般是半个小时左右)以后,程序发送数据正常,终端正常显示。
接收数据本来有问题,后面配置了串口的配置参数,使其接收原始数据,才不会丢失特殊字符。
程序如下:- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <termios.h>
- #include <string.h>
- #include <sys/ioctl.h>
- #include <sys/time.h>
- #include <termios.h>
- int usart_init(char * path);
- //根据具体的设备修改
- const char default_screen_path[] = "/dev/ttymxc2";
- void main(void)
- {
- unsigned char buf[250] = "Embedfire tty send test.01234567899876543210 abcdefghijklmnopqrstuvwxyz.\n";
- struct timeval start, end;
- int interval;
- //串口初始化
- int usart_fd = usart_init((char *)default_screen_path);
- if (usart_fd == 0)
- {
- printf("usart '%s' init failed", default_screen_path);
- }
- //tv_sec 单位秒 tv_usec 单位微秒,最大1000000
- gettimeofday(&start, NULL);
- while (1)
- {
- //系统计时 200ms 发送一条数据
- gettimeofday(&end, NULL);
- interval = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec - start.tv_usec) / 1000;
- if (interval > 1000)
- {
- // send message
- write(usart_fd, buf, sizeof(buf));
- printf("interval = %d\n", interval);
- interval = 0;
- gettimeofday(&start, NULL);
- }
- }
- close(usart_fd);
- return NULL;
- }
- //串口初始化
- int usart_init(char *path)
- {
- int fd;
- int res;
- struct termios opt;
- //获取串口设备描述符
- fd = open(path, O_RDWR | O_NOCTTY | O_NONBLOCK, 0777);
- if (fd < 0)
- {
- printf("Fail to Open %s device\n", path);
- return 0;
- }
- printf("open %s is successed\n", path);
- //清空串口接收缓冲区
- tcflush(fd, TCIOFLUSH);
- // 获取串口参数opt
- tcgetattr(fd, &opt);
- //设置串口输出波特率
- cfsetospeed(&opt, B115200);
- //设置串口输入波特率
- cfsetispeed(&opt, B115200);
- //设置数据位数
- opt.c_cflag &= ~CSIZE;
- opt.c_cflag |= CS8;
- //校验位
- opt.c_cflag &= ~PARENB;
- opt.c_iflag &= ~INPCK;
- //设置停止位
- opt.c_cflag &= ~CSTOPB;
- // &= 关闭 |= 设置
- //如果设置,使能规范输入,否者使用原始数据
- //opt.c_lflag &= ~ICANON;
- opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
- //如果设置,将NL转换成CR-NL后输出
- opt.c_oflag &= ~ONLCR;
- //如果设置,将接收到的NL(换行)转换成CR(回车)。
- opt.c_iflag &= ~INLCR;
- //最少可读数据
- opt.c_cc[VMIN] = 0;
- //等待数据时间(10秒的倍数)
- opt.c_cc[VTIME] = 0;
- //如果设置,则忽略接收到的break信号
- opt.c_iflag |= IGNBRK;
- //如果设置,则启用实现自定义的输入处理
- opt.c_lflag &= ~IEXTEN;
- //如果设置,则禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列
- opt.c_lflag |= NOFLSH;
- opt.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL);
- //使用原始数据输出
- opt.c_oflag &= ~OPOST;
- //更新配置
- if(tcsetattr(fd, TCSANOW, &opt) != 0)
- {
- printf("init error...........\n");
- return -1;
- }
- return fd;
- }
复制代码
正常的截图如下:
不正常的就是debian 的终端打印了很多条, 串口终端才打印很少的数据。
|
|