strstr cannot find substring but buffer contains t

2019-08-16 07:13发布

I was trying UART using STM32F407V6T6 and CubeMx.

My UART is working fine. The problem I'm getting while comparing the buffer: I am using strstr() to check that my buffer contains valid substring or not.

Here is the code:

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);
    }
}

Here what I am doing is I have connect my GSM Module Sim800 and I send AT. After debugging my code I found that buff[6] = 'O' and buff[7] = 'K'. And while checking that I could blink the led.

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

But when I try function strstr() It doesn't return anything.

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

At first I thought my array buff is not ending with \0. So I did this

     buff[9] = '\0';

But nothing changed.

Any suggestions why it's not working with strstr().

Thanks in advance.

1条回答
forever°为你锁心
2楼-- · 2019-08-16 07:46

From your observations and analysis, buff does contain OK at offset 6 and is null terminated at offset 9.

If strstr does not find OK in buff, a possible explanation is buff may contain another null terminator before offset 6 and OK is not present before this null terminator.

buff is initialized to all bits 0, so any element that is not changed is a null terminator. Is it also possible that HAL_UART_Receive_IT store null bytes into buff? null bytes are sometimes used as padding in serial transmissions.

It is also possible that the C library function strstr does not work on your target platform. I once had an inexplicable streak of bugs from faulty string functions on embedded ST platforms with their toolset.

查看更多
登录 后发表回答