STM32 - функция Strstr не работает, как я ожидал (UART) - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь найти указанную c строку в другой строке, полученной через UART. Тем не менее, моя функция возвращает 0, хотя строка не находится внутри полученной строки UART. Вот моя функция:

bool GetCommand(UART_HandleTypeDef *huart, char *command, char *getCommand, uint8_t size) {
    char *ptr;
    if (HAL_UART_Receive_IT(huart,command,size) == HAL_OK) {
        ptr = strstr(command,getCommand);
    }
    if (ptr) {
        return 1;
    } else {
        return 0;
    }
}

Программа работает с g cc, но она не работает, как я ожидал, когда я попробую ее с Keil. Можете ли вы помочь с этим вопросом?

Ответы [ 3 ]

2 голосов
/ 25 марта 2020

Ваша проблема не в функции strstr().

Это способ сбора вашей команды

if(HAL_UART_Receive_IT(huart,command,size) == HAL_OK) {
    ptr = strstr(command,getCommand);
}

HAL_UART_Receive_IT - это не блокирующая функция, поэтому она возвращается напрямую после настройки USART. Эта строка в вашем командном массиве сейчас не определена.

Используйте HAL_UART_Receive() или HAL_UART_RxCpltCallback()

0 голосов
/ 26 марта 2020

Дождитесь завершения UART, прежде чем использовать память. Не используйте неинициализированные переменные. В дополнение к другому ответу вы также можете опрашивать HAL_UART_State, пока периферийное устройство не прекратит прием.

bool GetCommand(UART_HandleTypeDef *huart, char *command, char *getCommand, uint8_t size) {
    if (HAL_UART_Receive_IT(huart,command,size) != HAL_OK) {
        // handle error
        return 0;
    }

    // wait until UART stops receiving
    while ((HAL_UART_State(huart) & HAL_UART_STATE_BUSY_RX) == HAL_UART_STATE_BUSY_RX) {
         continue;
    }

    return strstr(command, getCommand) != NULL;
}
0 голосов
/ 24 марта 2020

Попробуйте: выберите микролиб в целевом параметре

посмотрите это изображение

microlib option

...