0
votes

STM32 - La fonction Strstr ne fonctionne pas comme on m'attendait (UART)

J'essaie de trouver une chaîne spécifique dans une autre chaîne reçue via UART. Cependant, ma fonction renvoie 0, bien que la chaîne ne soit pas à l'intérieur de la chaîne de UART. Voici ma fonction:

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


2 commentaires

Cela semble être le même problème: communauté.arm.com/developer/tools-software/tools/f/keil-foru m / ...


Avant d'utiliser Strstr, assurez-vous que votre chaîne est Nul terminé


3 Réponses :


0
votes

Essayez ceci: Choisissez Microlib dans une option cible

Regarde cette image

 OPTION MICTIONB


2 commentaires

Merci pour votre réponse. Cependant, Microlib est déjà sélectionné.


Au début, le compilateur par défaut Keil est ARM GCC, la bibliothèque C est Microlib; vous pouvez exécuter ce programmateur par GCC, donc je pense que le C lib causer ce problème, peut-être qu'il y a un bogue dans ARMCC C LIB



2
votes

Votre problème n'est pas la fonction strtstr () .

C'est la façon dont vous collectez votre commande xxx

Hal_uart_receive_it est une fonction non bloquante, de sorte qu'il renvoie directement après la configuration de l'USART. Cette chaîne de votre tableau de commande est quelque chose d'indéfini à l'heure actuelle.

Utilisez hal_uart_receive () ou le hal_uart_rxcpltcallback ()


0 commentaires

0
votes

Attendez que le UART soit terminé avant d'utiliser la mémoire. N'utilisez pas de variables non initialisées. En plus de l'autre réponse, vous pouvez également interroger hal_uart_state jusqu'à ce que le périphérique cesse de recevoir.

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


1 commentaires

Je suis reconnaissant de votre réponse ... Cela fonctionne comme je prévoyai auparavant. Bonne journée :)