jxcrg_t35 发表于 2013-5-14 01:46:37

请教:串口中断接收问题

协议帧结构: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=SBUF0;
if(flag_0x10)//这样可以收到连续两个DATA是0x10的字节
{
flag_0x10=0;
break;
}else
{
if((uart0_rx_data==0x10)&&(uart0_rx_data==0x10))
{
--rx_count;
++rx_length;
flag_0x10=1;
}
}
}

lcw_swust 发表于 2013-5-14 08:56:49

http://wuqidongxing.blog.163.com/blog/static/18434950200791910512879/

jxcrg_t35 发表于 2013-5-14 12:36:39

谢谢,目前就是按这篇文章的状态机思路,编写的。通信协议为:以DLE(10H)、STX(02H)作为帧起始字段,以DLE(10H)、ETX(03H)作为帧结束字段。为避免在信息字段中出现DLE,影响数据的正确接收,数据发送方在发送数据前检查信息字段中是否出现DLE,如果信息字段中出现DLE字符,则在此DLE字符后再加一DLE字符。数据接收方如果连续收到两个DLE字符,表明此DLE是数据信息,而不是控制转义字符,去掉一个DLE即可。大家有什么好的思路么?

jxcrg_t35 发表于 2013-5-14 23:48:43

已解决


uart0_rx_data=SBUF0;
if(rx_count>UART0_RX_MAXLEN-1)//超出最大接收范围,接收错误,初始化
{
uart0_rx_status=1;
break;
}
if(flag_0x10)//前面收到一个0x10
{
if(uart0_rx_data==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==0x10)
{
--rx_count;//丢弃一个0x10
flag_0x10=0;//初始化,接收下一个
}
}
}
else
{
if(uart0_rx_data==0x10){flag_0x10=1;}
}
break;
页: [1]
查看完整版本: 请教:串口中断接收问题