菜鸟级别的问题,希望对像我一样的人有所帮助。

       我在做一个串口通信,上位机通过串口向控制板发送信号,信号的长度为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 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐