首页 > 代码库 > 串口编程 - C语言
串口编程 - C语言
串口的数据接收:
(1)定义一个字符数组,将一帧数据全部 接收完成后,再进行解析;
char transbuf[BUFSIZE]; char_ptr transbufptr = transbuf; uint_32 transnum; uint_32 TotalLen=0; static char TemBuf[1]={0};/*************************************接收一帧数据,存入transbuf [] ********************************************/ TemBuf[0] = 0; if ((transnum = _io_read( com_ptr /*串口设备的文件句柄*/, TemBuf, /*读到其中*/ 1 /*每次读1个字节*/))) { if(TemBuf[0]==0x02) {transbuf[0]=TemBuf[0];TotalLen=0;TotalLen++;continue;} //单字节的帧头,当重复出现时,直接替换 //多字节的帧头:处理不当(多字节一起读),容易丢失数据 if(transbuf[0]!=0x02) continue; //无效数据 if(transbuf[0]==0x02&&TemBuf[0]!=0x02&&TemBuf[0]!=0x03) //有效数据 {
transbuf[TotalLen]=TemBuf[0]; //存储数据 TotalLen++; if(TotalLen>4000) { transbuf[0]=0x00; TotalLen=0; } //数据长度过长(数据接收出错) continue; } // if(transbuf[0]==0x02&&TemBuf[0]==0x03) {transbuf[TotalLen]=TemBuf[0];TotalLen++;} //接收完毕 /* 0x02 ------- 一帧开始的帧头 0x03 ------- 一帧结束的标志 continue --- 跳到串口,获取下一个字节的数据 */ transnum=TotalLen; transbuf[TotalLen]=‘\0‘; TotalLen=0; } else continue; /*没有从串口读到数据*/
/*一帧数据全部接收完成;
*接下来根据协议的定义,解析帧命令*/
(2)分段接收(解析):
/********帧头是: 0xA0,0xB0,0xC0,0xD0****************/
fread(head1, 1, 1, uart_dev); /*读取1 个字节的帧头0xA0*/ if(head1[0] == 0xA0) { fread(head2, 1, 3, uart_dev); /*读取接下来3 个字节的帧头0xB0,0xC0,0xD0*/ /*如果帧头正确,继续接收6 个字节,分别是:*/ /*命令类型、亮度、数据长度、COLOR1,COLOR2,COLOR3 */ if((head2[0]==0xB0)&&(head2[1]==0xC0)&&(head2[2]==0xD0)) { fread(cmdData, 1, 6, uart_dev); /*从串口读取6 字节数据*/ } else { continue; /*帧头不正确*/ } } else { continue;/*读下一个字节*/ }
/*帧头接收完成,接下来接收数据、结束帧、校验帧*/ /* analysize the command. */ switch(cmdData[0]) /*判断命令类型*/ { case ‘D‘: /*实时显示*/ fread(dataD, 1, 36, uart_dev); //根据命令类型的不同,这里的数据长度也会不同 fread(tail, 1, 2, uart_dev); //结束帧、校验帧 if(tail[0]!=0xE0) continue; /*结束帧*/
/*
*接下来,做校验、解析命令的数据,执行相应操作*/
比较:
(1)单字节帧头 vs 多字节帧头:对于多字节的帧头,上述代码中,一次读取3个字节,有可能会出现数据的丢失;
(2)帧长不固定(且差别较大):分段接收,可能好一点;
(3)
无善无恶心之体
有善有恶意之动
知善知恶是良知
为善去恶是格物
串口编程 - C语言
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。