我正在尝试使用UART
和STM32F407V6T6
的{{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
。调试代码后,我发现了AT
和buff[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';
一起使用的建议。
谢谢。
答案 0 :(得分:1)
根据您的观察和分析,buff
的偏移量OK
确实包含6
,并且在偏移量9处终止为空。
如果strstr
在OK
中找不到buff
,则可能的解释是buff
可能在偏移6之前包含另一个空终止符,并且OK
不存在在此空终止符之前。
buff
初始化为所有位0,因此任何未更改的元素都是空终止符。 HAL_UART_Receive_IT
是否还可能将空字节存储到buff
中?空字节有时在串行传输中用作填充。
C库函数strstr
也有可能在您的目标平台上不起作用。曾经我在嵌入式ST平台及其工具集上的字符串函数错误导致了无法解释的错误。