嵌入式学习小组
直播中

陈建华

7年用户 227经验值
私信 关注

如何利用这个中断子程序实现数组第一位是I?

我想实现一个功能就是从串口接收数据 然后放到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;
}
}

回帖(4)

晏玉屏

2019-11-11 07:48:09
云汉达人
在接收中断理,只能读一次SBUF,第二次的数值就不确定是什么了,因为这时串口是空的。
  你可以设置一个状态代表是否接收到了“I”
举报

康瑜玲

2019-11-11 07:59:47
云汉达人
你好,关于你问的问题,你可以参考我这个程序试一下:
  其中: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;
 }
}
举报

孙翼飞

2019-11-11 08:16:31
收到一个字节,就中断一次。所以你读一次SBUF后集体应该退出中断了,下一个字节接收完成后,会再产生一次中断
举报

薛丽娜

2019-11-11 08:36:03
单片机的串口接受数据不是按帧算的么??你这程序问题很大!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分