LINUX串口一次不能全部读取串口内容
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
菜鸟级别的问题,希望对像我一样的人有所帮助。
我在做一个串口通信,上位机通过串口向控制板发送信号,信号的长度为23个字节。我使用Linux编程,自带的read()函数,用一个50个自己的数组来读,但是读取的字节数为8,9,13等不确定长度。不知道怎么做,想起来以前有个师兄跟我提过,单片机读取串口时,是一个字节一个字节读的,然后把读到帧头的数据,然后按照一定顺序往后读取定长的字节就好。
我问了个员工,他跟我解释说,串口通信是要时间的,比如你先读了一次,但是那边还没发完的概率是非常大的,所以,需要开辟一个缓存区,来保存你收到的内容,你要把收到第一次之后,然后再接着读取你需要的数据长度,这样就好了。
于是我就修改了我的代码,我每次读取的长度为8个字节,实际测试之后,可能会读到6个到8个字节,但多读几次就能都读全了。我的串口打开之后,一直在循环读取串口内容。代码如下,希望对需要的人有帮助。
char cmd_buf[23];
char rv_buf[8];
int ret_len,temp,i;
int len_sum = 0;
while(1)
{
ret_len = read(cmd_com_fd,rv_buf,8);
len_sum += ret_len;
//printf("读取数据长度:%d\t数据总长度:%d\n",ret_len,len_sum);
if(ret_len <= 0)//如果没有读取到数据继续等待读取
{
len_sum = 0;
continue;
}
if(ret_len >0 && len_sum<23)//如果读取数据大于0,而且总长度小于23,数据拷贝,继续读
{
for(i=0;i<ret_len;i++)
{
cmd_buf[len_sum+i-ret_len]=rv_buf[i];
//printf("数据总长度:%d\t序号:%d数据内容:%x\n",len_sum,len_sum+i-ret_len,cmd_buf[len_sum+i-ret_len]);
}
continue;
}
else if(ret_len >0 && len_sum>=23)//如果读取数据大于0,而且总长度大于等于23,数据拷贝,往下走
{
for(i=0;i<ret_len;i++)
{
cmd_buf[len_sum+i-ret_len]=rv_buf[i];
//printf("数据总长度:%d\t序号:%d数据内容:%x\n",len_sum,len_sum+i-ret_len,cmd_buf[len_sum+i-ret_len]);
}
len_sum = 0;
}
//判断帧头,不正确继续循环
if(cmd_buf[0] != 0xEB || cmd_buf[1] != 0x90)
{
//printf("帧头错误\n");
continue;
}
//帧头正确,进行你的数据帧解析和相应的操作
/*
....
*/
memset(cmd_buf,0,sizeof(cmd_buf));//一帧解析完之后,将cmd_buf清零
}
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献2条内容
所有评论(0)