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é