我使用strstr来搜索括号的开头和结尾,这样我就可以从我真正想要/需要的信息中过滤掉UART上发送的不正确条目。
我的UART中断将字符存储到一个数组中,并递增计数器。以下是我的主要功能中的代码:
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{345678},它会将startindex设置为3(这就是我想要的)。它成功地进入了循环,设置了startindex,并正确地清除了UART_RX_Buffer和计数器。
奇怪的是,它只是第一次通过。如果我第二次发送,我可以看到缓冲区中保存的数据与第一次相同。但它并没有进入第一个循环,识别出“{”性格如果我没有正确处理UART中断,并且缓冲区没有正确填充,我会看到一个问题。但事实并非如此。我真的不明白为什么我会用看起来相同的数据得到不同的结果(尤其是如果我能在尝试运行该行时确认数据在UART缓冲区中)。
很明显我错过了什么。有什么想法可能导致这种情况吗?如果有帮助的话,它是一个STM32L4R5ZI芯片(尽管我认为这是一个C问题,不是特定于设备的)。我将包括调试器的屏幕截图,以防有帮助。提前感谢
!