strstr找不到子字符串但缓冲区包含值

我正在尝试使用STM32F407V6T6CubeMx UART

我的UART工作正常。 我在比较缓冲区时遇到的问题:我使用strstr()来检查我的缓冲区是否包含有效的子字符串。

这是代码:

 uint8_t buff[10]; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); Green_Blink(100); Orange_Blink(100); Blue_Blink(100); Red_Blink(100); __HAL_UART_ENABLE_IT(&huart2, UART_IT_TC); __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); HAL_Delay(1000); while (1) { HAL_UART_Transmit_IT(&huart2, (uint8_t *)"AT\r\n", 5); Orange_Blink(100); HAL_Delay(1000); HAL_UART_Receive_IT(&huart2, buff, 10); buff[9] = '\0'; if (buff[6] == 'O' && buff[7] == 'K') { Green_Blink(1000); //Blinks } if (strstr((char*)buff, "OK")) { Red_Blink(1000); //Doesn't blink } Clear_Buffer((char*)buff); } } 

我在这里正在做的是我连接了我的GSM Module Sim800并且我发送了AT 。 调试完代码后,我发现buff[6] = 'O'buff[7] = 'K' 。 同时检查我是否可以使LED闪烁。

  if (buff[6] == 'O' && buff[7] == 'K') { Green_Blink(1000); //Blinks } 

但是当我尝试函数strstr()它不会返回任何内容。

  if (strstr((char*)buff, "OK")) { Red_Blink(1000); //RED LED DOENS'T Blink } 

起初我以为我的数组buff不是以\0结尾。 所以我这样做了

  buff[9] = '\0'; 

但没有改变。

任何建议为什么它不使用strstr()

提前致谢。

根据您的观察和分析, buff确实在偏移6处包含OK ,并在偏移9处终止。

如果strstrbuff找不到OK ,则可能的解释是buff可能在偏移量6之前包含另一个空终止符,并且在此null终止符之前不存在OK

buff被初始化为所有位0,因此任何未更改的元素都是空终止符。 HAL_UART_Receive_IT也可能将空字节存储到buff吗? 空字节有时用作串行传输中的填充。

C库函数strstr也可能无法在目标平台上运行。 我曾经在嵌入式ST平台上使用他们的工具集从错误的字符串函数中获得了一些莫名其妙的错误。