串口接收中断
时间:10-02
整理:3721RD
点击:
///////////////////////////////////////////////////////////////////////
// 接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
unsigned char len, i;
unsigned int j=0;
if(RI)
{
len=SBUF;
RI=0; //清除接收中断标志
for(i=0;i<len;i++)
{
while(!RI)
{
j++;
if(j>1000)
{
break;
} //防止误操作命令发生
}
if(j<1000)
{
RevBuffer[i]=SBUF; //RevBuffer[0]里面放的是收到命令字
RI=0;
j=0;
}
else
{
break;
}
}
if(i==len)
{
REN=0; //允许/禁止串行接收控制位。REN=0禁止串行接收
CmdValid=1; //CmdValid=1表示命令合法
}
}
else if(!RI && TI)
{
TI=0;
len=RevBuffer[0];
for(i=0;i<len+1;i++)
{
SBUF=RevBuffer[i];
while(!TI); //在同级中断中不会再次发生中断
TI=0;
}
REN=1;
}
}
这段程序刚开始len = SBUF,究竟是每来一个字节都这样,还是只执行一次?还有进入if(RI)后,RI= 0,那while(!RI)不是一直成立吗?纠结中......求大神指教
// 接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
unsigned char len, i;
unsigned int j=0;
if(RI)
{
len=SBUF;
RI=0; //清除接收中断标志
for(i=0;i<len;i++)
{
while(!RI)
{
j++;
if(j>1000)
{
break;
} //防止误操作命令发生
}
if(j<1000)
{
RevBuffer[i]=SBUF; //RevBuffer[0]里面放的是收到命令字
RI=0;
j=0;
}
else
{
break;
}
}
if(i==len)
{
REN=0; //允许/禁止串行接收控制位。REN=0禁止串行接收
CmdValid=1; //CmdValid=1表示命令合法
}
}
else if(!RI && TI)
{
TI=0;
len=RevBuffer[0];
for(i=0;i<len+1;i++)
{
SBUF=RevBuffer[i];
while(!TI); //在同级中断中不会再次发生中断
TI=0;
}
REN=1;
}
}
这段程序刚开始len = SBUF,究竟是每来一个字节都这样,还是只执行一次?还有进入if(RI)后,RI= 0,那while(!RI)不是一直成立吗?纠结中......求大神指教
if(RI)//如果接收到数据
{
len=SBUF;//读取第一个字节,这里代表这次传输共有多少字节
RI=0; //清除接收中断标志
for(i=0;i<len;i++)//开始有效数据接收,接收len个字节。连续读计算机串口缓存里发送的数据
{
while(!RI)//等待单片机接收移位寄存器载满即,接收到一字节
{
j++;//这个while里的作用就是超时放弃接收。
if(j>1000)
{
break;
} //防止误操作命令发生
}
……
最好再在进入那个for(i=0;i<len;i++)接收前,关掉ES中断。完毕后打开。
len=SBUF;是建立一次连接执行一次。一次连接会有len字节数据传来。
学习了。
刚开始是接收了一个字节数据,然后进入if(RI),但是这个if语句没执行完还可以继续接收数据吗?