标题:
单片机串口通讯接收数据时遇到的逻辑问题
[打印本页]
作者:
饮酒作乐
时间:
2020-5-11 15:11
标题:
单片机串口通讯接收数据时遇到的逻辑问题
本帖最后由 饮酒作乐 于 2020-5-11 15:35 编辑
串口中断部分的程序下所示。add代表地址位,0xff代表开始。我准备先判断初始位,再判断地址位,写入数组的只需要从地址位开始的后几位。现在遇到的问题是,当我用正确地址测试时没有异常,当我更改地址,按说应该再地址判断处截至的,却依然能执行(我设置断点看到了),但是只能执行一次,紧接着当我更改回正确地址测试时,第一次却不能执行,第二次才能执行。请各位帮我看一下。我自己实在看不出来
void UART_Interrupt (void) interrupt 4
{
static unsigned char t= 0;
static unsigned char i= 0;
uchar a;
if(RI) //接收字节
{
RI = 0;
if(t ==0) //判断第一位是否时起始位
{
a =SBUF;
if(a == 0xff)
{
a =0xc0;
t = 1;
}
}
else if(t == 1) //判断地址位是否正确
{
t=0;
a = SBUF;
if (a == add)
{
a = 0xc0;
t = 2;
}
}
if(t==2)
{
DateBuf[ i ] =SBUF; //将接收缓冲区的信息按位写入到数组中
i++;
if(i == 6)
{
i = 0;
t = 0;
date_over = 1;
}
}
}
if(TI)
{
TI = 0;
}
}
复制代码
作者:
wulin
时间:
2020-5-11 15:11
void UART_Interrupt (void) interrupt 4
{
static unsigned char i=0;
// if(RI)这个判断无意义,既然进入串口中断RI必定=1
RI=0;
DateBuf[i]=SBUF;
if(DateBuf[0]==0xff)//判断数据串第一个字节正确,否则覆盖掉
{
if(i==1)//判断数据串第二个字节错误
{
if(DateBuf[1]!=0xc0)
{
i=0;
DateBuf[0]=0x00;//清除后重新接收
DateBuf[1]=0x00;
}
else i++;
}
else
{
i++;
if(i==x)//x=数据串长度
{
flag=1;//接收完成标志置1,供主程序判断解析数据串
i=0;
}
}
}
}
作者:
xuyaqi
时间:
2020-5-11 16:17
不要在串口中断里做处理,中断里只做接收放到数组里,中断外做处理,否则影响接收。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1