请教:串口中断接收问题

2020-01-30 13:35发布

协议帧结构:0x10,0x02为帧头+长度+数据+ 0x10,0x03为帧尾
每次串口中断接收的相邻0x10是一组代表一个0x10数据,比如0x10,0x10,0x10,0x10x,0x10,0x10实际是3个0x10数据。目前我只能做到两个请大家看看,另在数据中0x10,0x10+0x10,0x03帧尾,也解不了。

if(rx_length--)//=0时,全部接收完成
{
uart0_rx_data[rx_count++]=SBUF0;
if(flag_0x10)//这样可以收到连续两个DATA是0x10的字节
{
flag_0x10=0;
break;
}else
{
if((uart0_rx_data[rx_count-2]==0x10)&&(uart0_rx_data[rx_count-1]==0x10))
{
--rx_count;
++rx_length;
flag_0x10=1;
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
lcw_swust
1楼-- · 2020-01-30 16:28
jxcrg_t35
2楼-- · 2020-01-30 22:22
谢谢,目前就是按这篇文章的状态机思路,编写的。通信协议为:以DLE(10H)、STX(02H)作为帧起始字段,以DLE(10H)、ETX(03H)作为帧结束字段。为避免在信息字段中出现DLE,影响数据的正确接收,数据发送方在发送数据前检查信息字段中是否出现DLE,如果信息字段中出现DLE字符,则在此DLE字符后再加一DLE字符。数据接收方如果连续收到两个DLE字符,表明此DLE是数据信息,而不是控制转义字符,去掉一个DLE即可。大家有什么好的思路么?
jxcrg_t35
3楼-- · 2020-01-30 23:14
已解决


uart0_rx_data[rx_count++]=SBUF0;
if(rx_count>UART0_RX_MAXLEN-1)//超出最大接收范围,接收错误,初始化
{
uart0_rx_status=1;
break;
}
if(flag_0x10)//前面收到一个0x10
{
if(uart0_rx_data[rx_count-1]==0x03)//收到结束字节,一帧结束
{
uart0_rx_over=1;
uart0_rx_status=1;
rx_length=0;
rx_count=0;
flag_0x10=0;
//break;
}
else//在判断是否0x10
{
if(uart0_rx_data[rx_count-1]==0x10)
{
--rx_count;//丢弃一个0x10
flag_0x10=0;//初始化,接收下一个
}
}
}
else
{
if(uart0_rx_data[rx_count-1]==0x10){flag_0x10=1;}
}
break;

一周热门 更多>