如何判断串口帧头数据

[复制链接]
15610|21
 楼主| xvezhe 发表于 2014-2-18 08:27 | 显示全部楼层 |阅读模式
数据帧头为  0x55  0xaa  ,如何用串口中断接收串口数据,检测帧头???,存储帧头后面的数据
嵌入式云终端 发表于 2014-2-18 08:33 | 显示全部楼层
应用查询的方法,用双判别条件,先检测是不是0x55,条件成立就在接受才判断是不是0xaa,若果两个条件都成立,则将后续的数据存储起来,这个地方在发送的时候要协商好,是固定个数目的数据,还是后面跟一个有效数据长度的数据,这样协议测算完整,存储完成跳出操作,重新检测贞头。
 楼主| xvezhe 发表于 2014-2-18 08:37 | 显示全部楼层
嵌入式云终端 发表于 2014-2-18 08:33
应用查询的方法,用双判别条件,先检测是不是0x55,条件成立就在接受才判断是不是0xaa,若果两个条件都成立 ...

可否提示点代码。。。
ningling_21 发表于 2014-2-18 08:39 | 显示全部楼层
用一个数组接收,如果第一个元素是0X55,第二个是0XAA就保存处理后面的数据,否则丢弃继续接收。
 楼主| xvezhe 发表于 2014-2-18 08:55 | 显示全部楼层
本帖最后由 xvezhe 于 2014-2-18 08:56 编辑
ningling_21 发表于 2014-2-18 08:39
用一个数组接收,如果第一个元素是0X55,第二个是0XAA就保存处理后面的数据,否则丢弃继续接收。 ...

dat_bug [ i ]= SBUF;                                            //接收串口数据
if(i==0&&0x55==dat_bug[0])      flag_bit=1;         
if(flag_bit&&0xaa==dat_bug[1])        start_bit=1;  //帧头


是否是这样。。。
lhchen922 发表于 2014-2-18 08:59 | 显示全部楼层
状态机。
  1. switch(com_serial_receiveStatus)
  2.     {
  3.         case FINDING_0X55 :
  4.         {
  5.             uint8_t byte = 0;
  6.             uart1_readReceiveBuffer(&byte,1);
  7.              、、、、
  8.             if(byte == (uint8_t)(0x55))
  9.                 com_serial_receiveStatus = NEED_0XAA;
  10.         }
  11.         break;
  12.         
  13.         case NEED_0XAA :
  14.         {
  15.                。。。。。。。。。。。
  16.             if(byte == (uint8_t)(0xAA))
  17.                 com_serial_receiveStatus = NEED_LENGTH;
  18.             else
  19.                 com_serial_receiveStatus = FINDING_0X55;
  20.         }
  21.         break;
  22.         
  23.         case NEED_LENGTH :
  24.         {
  25.     。。。。。。。。。。。
  26.             com_serial_receiveLength = length;
  27.             com_serial_receiveStatus = GETTING_DATA;
  28.         }
  29.         break;
  30.         case GETTING_DATA :
  31.         {
  32. 。。。。。。。。。。。。。。。。。
  33.             com_serial_receiveStatus = FINDING_0X55;
  34.         }
  35.         break;
  36.     }
huangxz 发表于 2014-2-18 09:00 | 显示全部楼层
xvezhe 发表于 2014-2-18 08:55
dat_bug [ i ]= SBUF;                                            //接收串口数据
if(i==0&&0x55==dat_b ...

可以这样,还是要辅助以完整性判断。
 楼主| xvezhe 发表于 2014-2-18 09:01 | 显示全部楼层
huangxz 发表于 2014-2-18 09:00
可以这样,还是要辅助以完整性判断。

可否详细点。。。
huangxz 发表于 2014-2-18 09:04 | 显示全部楼层
xvezhe 发表于 2014-2-18 09:01
可否详细点。。。

关键字判头没错,但是如果你遇到数据也有55 aa那如何处理啊
 楼主| xvezhe 发表于 2014-2-18 09:10 | 显示全部楼层
huangxz 发表于 2014-2-18 09:04
关键字判头没错,但是如果你遇到数据也有55 aa那如何处理啊

如果判断到帧头OK,标志位start_bit=1;  后面的数据是在
if(start_bit)存储
gxs64 发表于 2014-2-18 09:44 | 显示全部楼层
RE 9:这种情况是可能的,所以还要加上地址码、长度码等,这样出错的概率会小很多。
jiangxingyuan 发表于 2014-2-18 11:32 | 显示全部楼层
我一般用时间间隔来判别帧结束,如从上次收到数据结束起计时,经多长时间如还没有数据下来。则该帧结束,再加上帧头,数据长度,结束校验,基本可以保证数据的收发。
wqx0532 发表于 2014-2-18 16:29 | 显示全部楼层
状态机  

评论

好主意  发表于 2014-2-19 08:40
dragon_hn 发表于 2014-2-18 17:36 | 显示全部楼层
一般格式为:帧头+帧长度+。。。。。+SUM+帧尾
帧长度是必须的。注意中间负载数据也有可能存在“0x55  0xaa ”

valid_len=0;   // 全局变量

串口接收()

    if(valid_len==0)
        {
               if(SBUF==0x55)  valid_len=1;
        }
    else if(valid_len==1)
        {
                if(SBUF==0xAA)           valid_len=2;
                else if(SBUF==0x55)  ;
                else                                valid_len=0;
        }
        else
        {
                ....................
        }






775850100 发表于 2014-2-18 20:39 | 显示全部楼层
一般串口数据的格式:功能码+数据内容+校验码
我一般是使用两种方法:
一种关键字判断:即接收到0x55后,再判断是否接收到0xaa,如果是则进入下一步,根据发送数据的规约格式判断报文的长度,即可判断出接收数据的校验码在什么位置,保存!计算接收到的这一帧数据,自行计算校验结果,与接收到的校验码比较,如果相符,则保留,否则的话丢弃这一帧。
第二种是根据报文帧与帧之间的时间间隔判断一帧的结束。再分别对每一帧进行校验。
当然,如果串口发送的频率非常高,也可以将二者同时使用的
kaka3511 发表于 2014-2-18 23:13 | 显示全部楼层
很有用呢
kaka3511 发表于 2014-2-18 23:14 | 显示全部楼层
crjab 发表于 2014-2-19 08:04 | 显示全部楼层
什么都没有啊??
 楼主| xvezhe 发表于 2014-2-19 08:31 | 显示全部楼层
本帖最后由 xvezhe 于 2014-2-19 08:36 编辑
dragon_hn 发表于 2014-2-18 17:36
一般格式为:帧头+帧长度+。。。。。+SUM+帧尾
帧长度是必须的。注意中间负载数据也有可能存在“0x55  0xaa ...

valid_len=0;   // 全局变量

串口接收()

       if(valid_len==0)
        {
               if(SBUF==0x55)  valid_len=1;
        }
        if(valid_len==1)
        {
                if(SBUF==0xAA)           valid_len=2;
                else                                valid_len=0;
        }
        else
        {
                ....................
        }



这个是否同你的有区别呢?进不了 valid_len=2;
明月小厨 发表于 2014-2-19 08:42 | 显示全部楼层
13楼说的好,状态机的确在很多很多场合,可以让程序的结构变的极精简.:victory:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

225

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部