• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

求大神看看这个中断子程序有什么问题。

宋又锐 2015-10-21 浏览量:850
我想实现一个功能就是从串口接收数据 然后放到table数组 接收的数据是以“I”开头的 “;”结束的 数据长度共38个字符 数组就是38位的 我想实现正好数组的第一位是I最后一位是”;“下面的程序可以实现吗 有什么需要修改的地方?
void serial() interrupt 4
{
ES=0;
if (RI==1) {
inByte=SBUF;
if (inByte == \'I\') {
while (bufferPos != 38)
{
table[bufferPos] = inByte;
bufferPos++;
inByte =SBUF;
if (inByte == \';\') break;
}
}
read_if ();
RI=0;
ES=1;
}
}
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:4
  • 在接收中断理,只能读一次SBUF,第二次的数值就不确定是什么了,因为这时串口是空的。

    你可以设置一个状态代表是否接收到了“I”

  • 你好,关于你问的问题,你可以参考我这个程序试一下:

    其中:5A A5是帧头,发送数据的格式是:5A A5 长度 数据(N位)那么在数组里面的第一个数据就是代表长度,如果你要接受"I",那么只需要在数据的第一位放I就好了。

    void UART_ISR(void) interrupt 4     //串口中断接受
    {
     if(RI)
     {  
      DataTemp = SBUF;
      RI = 0;
      if(RXFRMOK==0)
      {
       if(RX5AOK)
       {
        if(RXA5OK)
        {
         RecData[LEN]=DataTemp;
         LEN++;
         if(LEN==(RecData[0]+1))
         {
          RXFRMOK=1;
          RX5AOK=RXA5OK=0;
         }
        }
        else
        {
         if(DataTemp==0xA5)
         {
          RXA5OK=1;
          LEN=0;
         }
        }
       }
       else
       {
        if(DataTemp==0x5A)
        {
         RX5AOK=1;
        }
       }
      }
     }
     else
     {
      TI = 0;
     }
    }

  • 收到一个字节,就中断一次。所以你读一次SBUF后集体应该退出中断了,下一个字节接收完成后,会再产生一次中断

  • 单片机的串口接受数据不是按帧算的么??你这程序问题很大!!

相关问题

问题达人换一批

求大神看看这个中断子程序有什么问题。