请教关于linux系统下 用read读取串口数据出现的丢失问题

as1_2 2017-07-19 09:37:01
在Linux串口下读取数据,总是丢失前面的一两个数据,每一帧数据都是这样,这是主要的源码:


int set_Parity(int fd, int databits, int stopbits, int parity) {
struct termios options;
if (tcgetattr(fd, &options) != 0) {
perror("SetupSerial 1");
//return (FALSE);
return 0;
}

options.c_cflag &= ~CSIZE;

switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
// fprintf(stderr, "Unsupported data size\n");
return 0;
}
switch (parity) {
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
//fprintf(stderr, "Unsupported parity\n");
return 0;
}
/* 设置停止位*/
switch (stopbits) {
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
//fprintf(stderr, "Unsupported stop bits\n");
return 0;
}

/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;

//修改输出模式,原始数据输出,这里可能需要去掉,跟原来的好像不一样
tcflush(fd, TCIFLUSH);
options.c_cc[VTIME] = 10; /* 设置超时15 seconds*/
options.c_cc[VMIN] = 8; /* Update the options and do it NOW */
if (tcsetattr(fd, TCSANOW, &options) != 0) {
perror("SetupSerial 3");
return 0;
}
return 1;
}
...全文
1688 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Acuity. 2017-07-21
  • 打赏
  • 举报
回复
引用 5 楼 as1_2 的回复:
[quote=引用 3 楼 qq_20553613 的回复:] 1、在Windows下用串口助手确定发送方不存在问题,或许是发送方的问题,研究就收方就瞎忙了; 2、确定发送方OK,重点查找Linux串口配置,读数逻辑,单步debug下就知道。
发现了问题的所在,就是串口发送数据,后面会跟着发送1字节数据,跟需要接收的数据冲掉了,但是这个问题需要怎么解决啊? 我的数据是连续发送的,但是之间有间隔1.5s,这个为什么会自动发送后面的1字节数据呢[/quote] 检查发送端的数据规则,最后一个是回车?换行符?等等
as1_2 2017-07-20
  • 打赏
  • 举报
回复
引用 6 楼 jklinux 的回复:
先加大接收数据的缓冲区,再分析多接收出来的是什么数据
没有多接收的,就是发送的时候自动发送去一些不相关的数,多发送了一些数据
jklinux 2017-07-20
  • 打赏
  • 举报
回复
先加大接收数据的缓冲区,再分析多接收出来的是什么数据
as1_2 2017-07-20
  • 打赏
  • 举报
回复
引用 3 楼 qq_20553613 的回复:
1、在Windows下用串口助手确定发送方不存在问题,或许是发送方的问题,研究就收方就瞎忙了; 2、确定发送方OK,重点查找Linux串口配置,读数逻辑,单步debug下就知道。
发现了问题的所在,就是串口发送数据,后面会跟着发送1字节数据,跟需要接收的数据冲掉了,但是这个问题需要怎么解决啊? 我的数据是连续发送的,但是之间有间隔1.5s,这个为什么会自动发送后面的1字节数据呢
as1_2 2017-07-20
  • 打赏
  • 举报
回复
引用 2 楼 jklinux 的回复:
需要确定是否与设备端的数据位、校验位、停止位、流控的设置一致,而且设备的串口程序已得确认下是否工作正常。
发现了问题的所在,就是串口发送数据,后面会跟着发送1字节数据,跟需要接收的数据冲掉了,但是这个问题需要怎么解决啊? 我的数据是连续发送的,但是之间有间隔1.5s,这个为什么会自动发送后面的1字节数据呢
Acuity. 2017-07-19
  • 打赏
  • 举报
回复
1、在Windows下用串口助手确定发送方不存在问题,或许是发送方的问题,研究就收方就瞎忙了; 2、确定发送方OK,重点查找Linux串口配置,读数逻辑,单步debug下就知道。
jklinux 2017-07-19
  • 打赏
  • 举报
回复
需要确定是否与设备端的数据位、校验位、停止位、流控的设置一致,而且设备的串口程序已得确认下是否工作正常。
as1_2 2017-07-19
  • 打赏
  • 举报
回复
哪位大侠,帮帮忙,找来找去也没找到解决的方法

1,616

社区成员

发帖
与我相关
我的任务
社区描述
智能硬件,智能手表,可穿戴设备,智能电视,谷歌眼镜,Google Glass 相关讨论。
社区管理员
  • 智能硬件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧