首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MikroC、dsPIC UART接收中断问题

MikroC、dsPIC UART接收中断问题
EN

Stack Overflow用户
提问于 2013-09-09 18:13:59
回答 1查看 1.8K关注 0票数 0

我正在通过UART与另一台设备通信。我通过向设备发送命令来请求某些信息。我一直在重复这个命令,直到我得到一个有用的答案。

我遇到的问题是,我使用的ISR在处理静态和已知字符串长度时工作得很好。但在这种情况下,我收到的字符串在任何时候都可能有不同的长度。例如取决于设备是否有错误。因此,假设前5个请求导致的错误字符串比预期长度短或长。而在尝试6中,它确实产生了具有预期长度的字符串,(软件)缓冲区似乎以某种方式被破坏。字节不在正确的位置,就像一些帧问题。

这就是我现在的ISR:

代码语言:javascript
复制
void UART1RXInterrupt() iv IVT_ADDR_U1RXINTERRUPT {

  uart_rd2[LoopVar0] = UART1_Read();
  LoopVar0++;
  if (LoopVar0 >= q) //Fill array until certain lenght
  {
   LoopVar0 = 0;
   ready0 = 1;
  }
  if (U1STA.OERR = 1)
  {
    U1STA.OERR = 0;
    U1STA.FERR = 0;
  }
  U1RXIF_bit = 0;
  }

以及我在主代码中处理它的方式:

代码语言:javascript
复制
UART1_Write_Text("A"); //Command
          if (ready0 == 1)//Data received
          {
            if (uart_rd2[0] == 0x4F && uart_rd2[1] == 0x4B) //Check message ID
            {
              //Found answer that I was looking for
            }
            ready0 = 0;
          }
          else
          delay_ms(2000); //Wait and try again
          }

应该如何设置我的代码来更好地处理这种情况?

EN

回答 1

Stack Overflow用户

发布于 2013-09-11 04:10:50

在中断例程中,当LoopVar0 >= q时,重置队列索引LoopVar0 = 0并设置标志ready0 = 1来处理main()中的队列数据。问题是,如果在main()中处理队列之前处理了新的中断,它们将覆盖队列内容。只要队列的开始不等于结束,就实现一个在circular queue ()中处理的主函数。这将使您有时间处理所有传入的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18695971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档