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

时间:2018-08-13 19:09:05

标签: c stm32f4discovery strstr sim800

我正在尝试使用UARTSTM32F407V6T6的{​​{1}}。

我的CubeMx工作正常。比较缓冲区时遇到的问题:我正在使用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。调试代码后,我发现了ATbuff[6] = 'O'。并且在检查我可以使LED闪烁时。

buff[7] = 'K'

但是当我尝试使用函数 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'; 一起使用的建议。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

C库函数strstr也有可能在您的目标平台上不起作用。曾经我在嵌入式ST平台及其工具集上的字符串函数错误导致了无法解释的错误。