论坛元老
 
- 积分
- 3071
- 金钱
- 3071
- 注册时间
- 2018-2-7
- 在线时间
- 285 小时
|
发表于 2018-5-31 10:18:22
|
显示全部楼层
[mw_shl_code=c,true]//接收数据标志位 各个位含义
//bit7:接收到尾 0xA5 0x5A 0 未收到 1 收到
//bit6:接收到头 0x55 0xAA 0 未收到 1 收到
//bit0-5:接收到数据个数 最多64个数据
unsigned char rec_flag = 0; //接收数据标志位
unsigned char rec_buf[10] = {0}; //接收数据存储
//串口接收数据格式为: 头1(0xA5) 头2(0x5A) 数据N位 尾1(0x55) 尾2(0xAA)
// 0xA5 0x5A xx xx xx xx xx xx xx xx xx xx xx 0x55 0xAA
__interrupt void UART1_Handle( void )
{
unsigned char res = 0;
if( rec_flag & 0x80 ) //如果接收数据结束返回 数据被读取后才清0 标志位
{
return;
}
res = UART1_DR;
UART1_SR &= ~( 1 << 5 ); //RXNE 清零
rec_flag++; //接收数据计数
//这种方式判断,可以有效识别类似 A5 A5 A5 5A XX XX 这样的数据开头
//如果只判断第一位是A5,第二位是5A的话,上面的这种数据就判定为非法数据,不能有效识别
if( ( res == 0xA5 ) && ( ( rec_flag & 0x40 ) == 0 ) ) //如果没有开始接收数据,并且当前的数据是0xA5 将计数清零
{
rec_flag = 0; //计数器清0
return;
}
if( ( rec_flag & 0x3F ) == 0x01 ) //计数器等于1
{
if( res == 0x5A ) //如果第二位数据是0x5A 说明已经正确收到了数据头
{
rec_flag |= ( 1 << 6 ); //接收到头第2位0x5A 置标志位
}
else
{
rec_flag = 0; //接收错误,重新开始
}
return;
}
if( ( ( rec_flag & 0x40 ) == 0x40 ) && ( ( rec_flag & 0x80 ) == 0 ) ) //已经成功接收到了头并且没有收到尾
{
//本次接收的是0xAA 上一笔数据是0x55 说明数据传输结束
//这种方式可以有效识别 数据和结束符一样的情况如 XX XX XX 55 55 55 AA
//如果接收到55就开始判断的话,上述的情况就会识别为非法数据,不能有效判断
if( res == 0xAA ) //接收到尾 第2位
{
rec_buf[(rec_flag & 0x3F) -2] = res;
if( rec_buf[( rec_flag & 0x3F) - 1 -2] == 0x55 ) //如果上次接收的数据是 尾第1位
{
rec_flag |= ( 1 << 7 ); //接收数据结束
}
}
else
{
rec_buf[(rec_flag & 0x3F) -2] = res; //存储接收到的数据
}
}
}[/mw_shl_code]
|
|