我使用 strstr 搜索括号的开头和结尾,这样我就可以从我实际想要/需要的信息中过滤掉 UART 上发送的错误条目。
我的 UART 中断将字符存储到数组中并递增计数器。下面是我的 main 函数中的代码:
volatile char UART_RX_Buffer[128]; // updated in UART
volatile uint16_t UART_Byte_Counter = 0; // updated in UART
while (1)
{
if(strstr(&UART_RX_Buffer[0], "{") != NULL)
{
if(strstr(&UART_RX_Buffer[0], "}") != NULL)
{
char *ret;
int startindex;
ret = strstr(&UART_RX_Buffer[0], "{");
startindex = (ret - UART_RX_Buffer);
// Clear out UART array and counter
char Empty_Buffer[128] = {0};
memcpy (UART_RX_Buffer, Empty_Buffer, sizeof(UART_RX_Buffer));
UART_Byte_Counter = 0;
}
}
}
因此,如果我发送它,比如 012{345,678},它会将 startindex 设置为 3(这就是我想要的)。已成功进入循环,设置 startindex,并正确清除 UART_RX_Buffer 和计数器。
奇怪的是它只在第一次时有效。如果我第二次发送它,我可以看到缓冲区保存与第一次相同的数据。 。 。但它没有进入第一个循环,识别“{”字符。如果我没有正确处理 UART 中断并且缓冲区没有被正确填充,我就会发现一个问题。 。 。但情况似乎并非如此。我真的不明白为什么看似相同的数据会得到不同的结果(特别是如果我在尝试运行该行时可以确认数据位于 UART 缓冲区中)。
显然我错过了一些东西。有什么想法可能导致这种情况吗?如果有帮助,它是一个 STM32L4R5ZI 芯片(尽管我认为这是一个 C 问题而不是特定于设备)。我将包含调试器的屏幕截图,以防有帮助。预先感谢!