打印

如何判断串口帧头数据

[复制链接]
13978|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xvezhe|  楼主 | 2014-2-18 08:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
嵌入式云终端| | 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就保存处理后面的数据,否则丢弃继续接收。

使用特权

评论回复
5
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;  //帧头


是否是这样。。。

使用特权

评论回复
6
lhchen922| | 2014-2-18 08:59 | 只看该作者
状态机。
switch(com_serial_receiveStatus)
    {
        case FINDING_0X55 :
        {
            uint8_t byte = 0;
            uart1_readReceiveBuffer(&byte,1);
             、、、、
            if(byte == (uint8_t)(0x55))
                com_serial_receiveStatus = NEED_0XAA;
        }
        break;
        
        case NEED_0XAA :
        {
               。。。。。。。。。。。
            if(byte == (uint8_t)(0xAA))
                com_serial_receiveStatus = NEED_LENGTH;
            else
                com_serial_receiveStatus = FINDING_0X55;
        }
        break;
        
        case NEED_LENGTH :
        {
    。。。。。。。。。。。
            com_serial_receiveLength = length;
            com_serial_receiveStatus = GETTING_DATA;
        }
        break;
        case GETTING_DATA :
        {
。。。。。。。。。。。。。。。。。
            com_serial_receiveStatus = FINDING_0X55;
        }
        break;
    }

使用特权

评论回复
7
huangxz| | 2014-2-18 09:00 | 只看该作者
xvezhe 发表于 2014-2-18 08:55
dat_bug [ i ]= SBUF;                                            //接收串口数据
if(i==0&&0x55==dat_b ...

可以这样,还是要辅助以完整性判断。

使用特权

评论回复
8
xvezhe|  楼主 | 2014-2-18 09:01 | 只看该作者
huangxz 发表于 2014-2-18 09:00
可以这样,还是要辅助以完整性判断。

可否详细点。。。

使用特权

评论回复
9
huangxz| | 2014-2-18 09:04 | 只看该作者
xvezhe 发表于 2014-2-18 09:01
可否详细点。。。

关键字判头没错,但是如果你遇到数据也有55 aa那如何处理啊

使用特权

评论回复
10
xvezhe|  楼主 | 2014-2-18 09:10 | 只看该作者
huangxz 发表于 2014-2-18 09:04
关键字判头没错,但是如果你遇到数据也有55 aa那如何处理啊

如果判断到帧头OK,标志位start_bit=1;  后面的数据是在
if(start_bit)存储

使用特权

评论回复
11
gxs64| | 2014-2-18 09:44 | 只看该作者
RE 9:这种情况是可能的,所以还要加上地址码、长度码等,这样出错的概率会小很多。

使用特权

评论回复
12
jiangxingyuan| | 2014-2-18 11:32 | 只看该作者
我一般用时间间隔来判别帧结束,如从上次收到数据结束起计时,经多长时间如还没有数据下来。则该帧结束,再加上帧头,数据长度,结束校验,基本可以保证数据的收发。

使用特权

评论回复
13
wqx0532| | 2014-2-18 16:29 | 只看该作者
状态机  

使用特权

评论回复
评论
明月小厨 2014-2-19 08:40 回复TA
好主意 
14
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
        {
                ....................
        }






使用特权

评论回复
15
775850100| | 2014-2-18 20:39 | 只看该作者
一般串口数据的格式:功能码+数据内容+校验码
我一般是使用两种方法:
一种关键字判断:即接收到0x55后,再判断是否接收到0xaa,如果是则进入下一步,根据发送数据的规约格式判断报文的长度,即可判断出接收数据的校验码在什么位置,保存!计算接收到的这一帧数据,自行计算校验结果,与接收到的校验码比较,如果相符,则保留,否则的话丢弃这一帧。
第二种是根据报文帧与帧之间的时间间隔判断一帧的结束。再分别对每一帧进行校验。
当然,如果串口发送的频率非常高,也可以将二者同时使用的

使用特权

评论回复
16
kaka3511| | 2014-2-18 23:13 | 只看该作者
很有用呢

使用特权

评论回复
17
kaka3511| | 2014-2-18 23:14 | 只看该作者
真的

使用特权

评论回复
18
crjab| | 2014-2-19 08:04 | 只看该作者
什么都没有啊??

使用特权

评论回复
19
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;

使用特权

评论回复
20
明月小厨| | 2014-2-19 08:42 | 只看该作者
13楼说的好,状态机的确在很多很多场合,可以让程序的结构变的极精简.:victory:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

225

帖子

2

粉丝