如何判断串口帧头数据
数据帧头为0x550xaa,如何用串口中断接收串口数据,检测帧头???,存储帧头后面的数据应用查询的方法,用双判别条件,先检测是不是0x55,条件成立就在接受才判断是不是0xaa,若果两个条件都成立,则将后续的数据存储起来,这个地方在发送的时候要协商好,是固定个数目的数据,还是后面跟一个有效数据长度的数据,这样协议测算完整,存储完成跳出操作,重新检测贞头。 嵌入式云终端 发表于 2014-2-18 08:33 static/image/common/back.gif
应用查询的方法,用双判别条件,先检测是不是0x55,条件成立就在接受才判断是不是0xaa,若果两个条件都成立 ...
可否提示点代码。。。 用一个数组接收,如果第一个元素是0X55,第二个是0XAA就保存处理后面的数据,否则丢弃继续接收。 本帖最后由 xvezhe 于 2014-2-18 08:56 编辑
ningling_21 发表于 2014-2-18 08:39 static/image/common/back.gif
用一个数组接收,如果第一个元素是0X55,第二个是0XAA就保存处理后面的数据,否则丢弃继续接收。 ...
dat_bug [ i ]= SBUF; //接收串口数据
if(i==0&&0x55==dat_bug) flag_bit=1;
if(flag_bit&&0xaa==dat_bug) start_bit=1;//帧头
是否是这样。。。 状态机。
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;
} xvezhe 发表于 2014-2-18 08:55 static/image/common/back.gif
dat_bug [ i ]= SBUF; //接收串口数据
if(i==0&&0x55==dat_b ...
可以这样,还是要辅助以完整性判断。 huangxz 发表于 2014-2-18 09:00 static/image/common/back.gif
可以这样,还是要辅助以完整性判断。
可否详细点。。。 xvezhe 发表于 2014-2-18 09:01 static/image/common/back.gif
可否详细点。。。
关键字判头没错,但是如果你遇到数据也有55 aa那如何处理啊 huangxz 发表于 2014-2-18 09:04 static/image/common/back.gif
关键字判头没错,但是如果你遇到数据也有55 aa那如何处理啊
如果判断到帧头OK,标志位start_bit=1;后面的数据是在
if(start_bit)存储 RE 9:这种情况是可能的,所以还要加上地址码、长度码等,这样出错的概率会小很多。 我一般用时间间隔来判别帧结束,如从上次收到数据结束起计时,经多长时间如还没有数据下来。则该帧结束,再加上帧头,数据长度,结束校验,基本可以保证数据的收发。 状态机 一般格式为:帧头+帧长度+。。。。。+SUM+帧尾
帧长度是必须的。注意中间负载数据也有可能存在“0x550xaa ”
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
{
....................
}
}
一般串口数据的格式:功能码+数据内容+校验码
我一般是使用两种方法:
一种关键字判断:即接收到0x55后,再判断是否接收到0xaa,如果是则进入下一步,根据发送数据的规约格式判断报文的长度,即可判断出接收数据的校验码在什么位置,保存!计算接收到的这一帧数据,自行计算校验结果,与接收到的校验码比较,如果相符,则保留,否则的话丢弃这一帧。
第二种是根据报文帧与帧之间的时间间隔判断一帧的结束。再分别对每一帧进行校验。
当然,如果串口发送的频率非常高,也可以将二者同时使用的 很有用呢 真的 什么都没有啊?? 本帖最后由 xvezhe 于 2014-2-19 08:36 编辑
dragon_hn 发表于 2014-2-18 17:36 static/image/common/back.gif
一般格式为:帧头+帧长度+。。。。。+SUM+帧尾
帧长度是必须的。注意中间负载数据也有可能存在“0x550xaa ...
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; 13楼说的好,状态机的确在很多很多场合,可以让程序的结构变的极精简.:victory:
页:
[1]
2