我正通过UART与其他设备通信。我通过向设备发送命令来请求某些信息。我正在重复这个命令,直到我收到一个可用的答案。
我遇到的问题是,当你处理静态和已知的字符串长度时,我使用的ISR工作正常。 但在这种情况下,我收到的字符串在任何时候都可以有不同的长度。取决于如果设备有错误。 因此,假设前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
}
如何设置我的代码以更好地处理这种情况?
答案 0 :(得分:0)
在LoopVar0 >= q
中的中断例程中,重置队列索引LoopVar0 = 0
并设置标志ready0 = 1
以处理main()中的队列数据。问题是如果在main()中处理队列之前处理新的中断,它们将覆盖队列内容。只要队列的开头不等于结束,就实现在main()中处理的circular queue。这将为您提供处理所有传入数据的时间。