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; } }
3 Réponses :
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
Votre problème n'est pas la fonction C'est la façon dont vous collectez votre commande p> Utilisez strtstr () code>.
Hal_uart_receive_it code> 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. P>
hal_uart_receive () code> ou le
hal_uart_rxcpltcallback () p> p> p> p> p> p> p> P> P> P> P >
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; }
Je suis reconnaissant de votre réponse ... Cela fonctionne comme je prévoyai auparavant. Bonne journée :)
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 code> terminé