微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 串口接收中断

串口接收中断

时间: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)不是一直成立吗?纠结中......求大神指教

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语句没执行完还可以继续接收数据吗?

上一篇:Mobile SDRAM
下一篇:motorola MCP820单片机

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top