0

我正在尝试UART使用STM32F407V6T6and 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'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().

提前致谢。

4

1 回答 1

1

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

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

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

C 库函数也可能strstr在您的目标平台上不起作用。我曾经在使用他们的工具集的嵌入式 ST 平台上遇到错误字符串函数的一系列莫名其妙的错误。

于 2018-08-13T21:25:07.200 回答