main()
{
while(1){
if(Receiver_Count>0) //如果串口中断接收到数据,侧马上进入接收剩余数据的等待
{
Time20msCnt=0;
while(Time20msCnt<5) //根据要接收的数据多少和波特率,确定大概的等待时间
{
if((Data_Buffer[0]==0x12)&&(Data_Buffer[1]==0x21)){ //收到固定的指令数据0x12 0x21后,
//给指令标志ack赋特定的值 并且马上结束等待
ack=1;
Data_Buffer[0]=0;
Data_Buffer[1]=0;
break;
}
if(Data_Buffer[0]==0x30&Data_Buffer[1]==0x31){
ack=2;
Data_Buffer[0]=0;
Data_Buffer[1]=0;
break;
}
}
Receiver_Count=0;
}
}
}
void UARTInterrupt(void) interrupt 4 //串口中断
{
if(RI)
{
if(Receiver_Count<5)
{
Data_Buffer[Receiver_Count++]=SBUF;
}
RI = 0;
}
else return;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
接收尽量在中断中完成,这样时间利用率比较高。
简单说吧,你一般都会定义一个全局数组变量吧?和一个下标变量x。还需要几个变量为你的协议用,比如长度...再用一个数组保存内容数据。
假定数组 ary[n字节]
假定帧头 2 字节,分别为 0x55 0xAA(哦,这是俺常用的),那么一旦收到第一个字节为 0x55,就可以开始判断了:
ary[x] = 缓冲
if (ary[0]!==0x55)
return;
if (ary[1]!=0xAA)
return;
id = ary[2]
len = ary[?]
再根据长度依次取内容数据放到另一个数组里,由主程序处理它(如果功能简单,在中断里处理也可以)。。。
收完校验字节后,计算比较。。。
最后判断帧尾,虽然用途不大,不过可以表明数据是否接收完毕以及通讯是否完整。
俺一般是把 功能(用途)字节和数据放在一起。
一周热门 更多>