【问题标题】:MikroC, dsPIC UART receive interrupt issueMikroC、dsPIC UART 接收中断问题
【发布时间】:2013-09-09 10:13:58
【问题描述】:

我正在通过 UART 与其他设备通信。我通过向设备发送命令来请求某些信息。我正在重复该命令,直到收到可用的答案。

我遇到的问题是,当您处理静态和已知字符串长度时,我使用的 ISR 工作正常。 但在这种情况下,我收到的字符串随时可能有不同的长度。取决于例如on 如果设备有错误或没有。 因此,假设前 5 个请求导致错误字符串比预期长度短或长。在尝试 6 时,它确实会生成一个具有预期长度的字符串,(软件)缓冲区似乎以某种方式损坏。字节不在正确的位置,例如一些框架问题。

这就是现在的 ISR:

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;
  }

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

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
          }

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

【问题讨论】:

    标签: c interrupt pic uart mikroc


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-26
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2018-10-04
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多