码迷,mamicode.com
首页 > 编程语言 > 详细

串口编程 - C语言

时间:2015-02-03 14:47:19      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:

串口的数据接收:

(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语言

标签:

原文地址:http://www.cnblogs.com/nju347/p/4269742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!