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進行處理,處理之前別忘了幀尾后面的字符是新的一楨的開頭部分,要把它們也保存下來。在程序中我們看到讀不到數據就返回,如果不返回,這個函數就會一直運行,那么這樣做的效果不就等價於阻塞操作了么,非阻塞就失去了其意義。
大概就這樣吧。
linux串口拼接,Linux下串口操作之數據拼接相关推荐
- mysql使用从c3p0_使用c3p0連接池操作mysql數據庫中文亂碼解決辦法
今天在一台新的CentOS機器上使用c3p0連接池操作mysql數據庫出現中文亂碼問題,具體表現為:查詢時無中文亂碼問題,寫數據時中文亂碼,查看了機器上數據庫字符集也是UTF8,應該不會出現中文亂碼才 ...
- dos环境c语言写串口程序,DOS下串口通信程序来传送文件的源代码(转)
我们PC/104系统只能装DOS,并且只有串口.平时调试很不方便,需要将电脑里的程序写到软盘,然后 再通过软盘复制到开发装置.可怜软驱还不争气,到现在已经坏了好多软盘了.而且调试间和办公室离得比较远. ...
- linux vmstat io,linux磁盤IO查看iostat,vmstat
linux磁盤IO查看(iostat) ############## # # 操作 # ############## # iostat -x 1 10 Linux 2.6.18-92.el5xe ...
- linux下串口通信程序,关于Linux下串口通信的一点心得
1. 打开串口 与其他的关于设备编程的方法一样,在 Linux 下,操作.控制串口也是通过操作起设备文件进行的.在 Linux 下,串口的设备文件是 /dev/ttyS0 或 /dev/ttyS1 等 ...
- Linux下串口编程入门
1. 串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EI ...
- Linux下串口编程遇 接收数据错误问题及原因
近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一:另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二. 由于问题莫名其 ...
- Linux下串口编程基础
串口知识 串行接口 (SerialInterface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用 ...
- Linux下C语言串口应用编程,Linux下串口C语言编程
Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...
- linux 下串口转usb不能发送数据包,红帽redhat下 串口转USB问题 linux
满意答案 参考答案: 奇文共欣赏,疑义相与析.(陶渊明) 1.将设备u口插入pc 2.输入#lsmod 先看看能否检测到这个设备,就看有没有pl2303字眼可以了.如果有,则不需要再装驱动.另外如果有 ...
最新文章
- Go 学习笔记(42)— Go 标准库之 os/user(获取Uid、Gid、Username、Name、HomeDir、查询用户、查询用户组)
- 2020年中国知识图谱行业分析报告(附全文下载)
- 加载XML 添加删除节点
- boost::ptr_set相关的测试程序
- docker环境下的测试
- spring实现IOC的思路和方法
- Java—线程的生命周期及线程控制方法详解
- 领域建模——架构设计的第一步(下)
- 计算机辅助翻译入门试题,2011级计算机辅助翻译考试试题纸(A卷)
- Java DatagramPacket 中的坑
- iOS基础 - UIScrollView
- PDF动态生僻字文本处理
- Windows XP系统下建立V-PN服务器
- VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
- Linux 中有效用户组和初始用户组
- Spark-core电商分析
- 01什么是FPGA?
- 中国人为什么喜欢蹲着?
- R语言向图像中添加LaTeX风格数学公式
- 笨鸟先飞学编程系列之二 基础代码的编写1(转)
热门文章
- C++ explicit constructor/copy constructor note
- 防护很重要!教你教你认识和检验安防产品的IP防护等级
- Codeforces Round #353 (Div. 2)
- PHP开发移动端接口
- 关于android相机开发中遇到的内存溢出的问题
- 如何用staruml画包图_StarUML的9种图
- 公司--As Imp的写法
- java 查询线程_Java多线程查询
- bios设置 联想m8000t_联想怎样设置双显卡模式 联想设置双显卡模式方法【详解】...
- 第十六届全国大学生智能汽车竞赛安徽赛区赛事指南