首页 > 代码库 > 串口编程 - 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语言