设为首页 加入收藏

TOP

Linux下串口操作之数据拼接
2015-04-07 15:30:26 来源: 作者: 【 】 浏览:46
Tags:Linux 串口 操作 数据 拼接

Linux串口操作中,特别以非阻塞的方式读取和发送数据,做好进程之间的同步很重要。有时我们会发现这样一个问题,在进行read操作时,一次read不能获得一个完整的数据帧,这就好比你买了一个电脑,送货的先把显示器送到你家,再把机箱送到,你会发现还少键盘鼠标什么的,又要过几天才送,这会让你急死。很不幸,在串口操作的时候,接受数据很可能就是这样分批收货的,但是幸运的是,接受数据的动作很快,别忘了计算机就是靠速度这一点,抛开这个,啥都不是。


很自然的,我们就会进行数据的拼接,将一堆零散的数据拼接成一个个有用的数据帧,哈哈,变废为宝。说多了让人很烦,举个例子吧。


假如我们定义的数据帧是以'$'开头,以‘#’结尾的。


首先定义了两个字符数组:


//一个缓冲数组,用来存放每一次读到的数据
char read_data[256]={0};
//存放一个完整的数据帧,以便处理
char read_buf[256]={0};


再看看凭借数据的函数是怎么样实现的:


//得到了一个完整的数据帧
void get_complete_frame()
{
? ? char read_tmp[256]={0};
? ? int return_flag=0;
? ? int i;
? ? //存放读取到的字节数
? ? while(1)
? ? {
? ? ? memset(read_tmp,0,sizeof(read_tmp));
? ? ? if(read(fd, read_tmp, sizeof(read_tmp))>0)
? ? ? {
? ? ? ? //数据帧的拼接
? ? ? ? printf("read_tmp: %s\n",read_tmp);
? ? ? ? for( i=0;i? ? ? ? {
? ? ? ? ? ? ? if(read_tmp[i]=='$')
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? memset(read_data,0,sizeof(read_data));
? ? ? ? ? ? ? ? char tmp[5]={0};
? ? ? ? ? ? ? ? tmp[0]=read_tmp[i];
? ? ? ? ? ? ? ? strcat(read_data,tmp);
? ? ? ? ? ? ? }
? ? ? ? ? ? ? else if(read_tmp[i]=='#')
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? char tmp[5]={0};
? ? ? ? ? ? ? ? tmp[0]=read_tmp[i];
? ? ? ? ? ? ? ? strcat(read_data,tmp);
? ? ? ? ? ? ? ? return_flag=1;
? ? ? ? ? ? ? ? memset(read_buf,0,sizeof(read_buf));
? ? ? ? ? ? ? ? //遇到帧尾,将read_data帧拷贝到read_buf中,以便处理
? ? ? ? ? ? ? ? memcpy(read_buf,read_data,sizeof(read_data));
? ? ? ? ? ? ? }
? ? ? ? ? ? ? else
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? char tmp[5]={0};
? ? ? ? ? ? ? ? tmp[0]=read_tmp[i];
? ? ? ? ? ? ? ? strcat(read_data,tmp);
? ? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //有了一个完整的数据帧就返回处理
? ? ? ? if(return_flag==1)
? ? ? ? ? ? return;
? ? ? }
? ? ? else//读不到数据就返回,以便检查对方是否断线
? ? ? ? return;
? ? usleep(100000);
? ? }
}


从上面的代码中,我们可以看到,每一次从串口读取数据,将读到的数据放在read_tmp中。对这个数组进行逐个地字符分析,遇到帧头标志就清空缓冲数组read_data中,保证了缓冲数组中的数组都是以‘$’开头的;如果遇到了帧尾,哈,我们现在遇到有了一个完整的帧啦,可以去处理帧咯,将数据帧拷贝到read_buf中,程序直接对read_buf进行处理,处理之前别忘了帧尾后面的字符是新的一桢的开头部分,要把它们也保存下来。在程序中我们看到读不到数据就返回,如果不返回,这个函数就会一直运行,那么这样做的效果不就等价于阻塞操作了么,非阻塞就失去了其意义。


大概就这样吧。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中指针作为函数形参的思考 下一篇Linux下打开串口设置

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: