串口操作中,特別以非阻塞的方式讀取和發送數據,做好進程之間的同步很重要。有時我們會發現這樣一個問題,在進行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進行處理,處理之前別忘了幀尾后面的字符是新的一楨的開頭部分,要把它們也保存下來。在程序中我們看到讀不到數據就返回,如果不返回,這個函數就會一直運行,那么這樣做的效果不就等價於阻塞操作了么,非阻塞就失去了其意義。

大概就這樣吧。

linux串口拼接,Linux下串口操作之數據拼接相关推荐

  1. mysql使用从c3p0_使用c3p0連接池操作mysql數據庫中文亂碼解決辦法

    今天在一台新的CentOS機器上使用c3p0連接池操作mysql數據庫出現中文亂碼問題,具體表現為:查詢時無中文亂碼問題,寫數據時中文亂碼,查看了機器上數據庫字符集也是UTF8,應該不會出現中文亂碼才 ...

  2. dos环境c语言写串口程序,DOS下串口通信程序来传送文件的源代码(转)

    我们PC/104系统只能装DOS,并且只有串口.平时调试很不方便,需要将电脑里的程序写到软盘,然后 再通过软盘复制到开发装置.可怜软驱还不争气,到现在已经坏了好多软盘了.而且调试间和办公室离得比较远. ...

  3. linux vmstat io,linux磁盤IO查看iostat,vmstat

    linux磁盤IO查看(iostat) ############## # #    操作 # ############## # iostat -x 1 10 Linux 2.6.18-92.el5xe ...

  4. linux下串口通信程序,关于Linux下串口通信的一点心得

    1. 打开串口 与其他的关于设备编程的方法一样,在 Linux 下,操作.控制串口也是通过操作起设备文件进行的.在 Linux 下,串口的设备文件是 /dev/ttyS0 或 /dev/ttyS1 等 ...

  5. Linux下串口编程入门

    1. 串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EI ...

  6. Linux下串口编程遇 接收数据错误问题及原因

    近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一:另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二. 由于问题莫名其 ...

  7. Linux下串口编程基础

    串口知识 串行接口 (SerialInterface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用 ...

  8. Linux下C语言串口应用编程,Linux下串口C语言编程

    Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...

  9. linux 下串口转usb不能发送数据包,红帽redhat下 串口转USB问题 linux

    满意答案 参考答案: 奇文共欣赏,疑义相与析.(陶渊明) 1.将设备u口插入pc 2.输入#lsmod 先看看能否检测到这个设备,就看有没有pl2303字眼可以了.如果有,则不需要再装驱动.另外如果有 ...

最新文章

  1. Go 学习笔记(42)— Go 标准库之 os/user(获取Uid、Gid、Username、Name、HomeDir、查询用户、查询用户组)
  2. 2020年中国知识图谱行业分析报告(附全文下载)
  3. 加载XML 添加删除节点
  4. boost::ptr_set相关的测试程序
  5. docker环境下的测试
  6. spring实现IOC的思路和方法
  7. Java—线程的生命周期及线程控制方法详解
  8. 领域建模——架构设计的第一步(下)
  9. 计算机辅助翻译入门试题,2011级计算机辅助翻译考试试题纸(A卷)
  10. Java DatagramPacket 中的坑
  11. iOS基础 - UIScrollView
  12. PDF动态生僻字文本处理
  13. Windows XP系统下建立V-PN服务器
  14. VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
  15. Linux 中有效用户组和初始用户组
  16. Spark-core电商分析
  17. 01什么是FPGA?
  18. 中国人为什么喜欢蹲着?
  19. R语言向图像中添加LaTeX风格数学公式
  20. 笨鸟先飞学编程系列之二 基础代码的编写1(转)

热门文章

  1. C++ explicit constructor/copy constructor note
  2. 防护很重要!教你教你认识和检验安防产品的IP防护等级
  3. Codeforces Round #353 (Div. 2)
  4. PHP开发移动端接口
  5. 关于android相机开发中遇到的内存溢出的问题
  6. 如何用staruml画包图_StarUML的9种图
  7. 公司--As Imp的写法
  8. java 查询线程_Java多线程查询
  9. bios设置 联想m8000t_联想怎样设置双显卡模式 联想设置双显卡模式方法【详解】...
  10. 第十六届全国大学生智能汽车竞赛安徽赛区赛事指南