Cette réponse a aidé l’auteur du sujet
Bonjour,
Je travaille actuellement avec un STM32F446RE. Pour m’entraîner avec le périphérique UART, j’esaye d’allumer et d’éteindre une led lorsque j’appuie sur une touche. J’ai réussi sans problème avec la touche 1 mais pas moyen de le faire avec la touche t (comme toggle). Je sais d’où vient le problème mais pas comment le résoudre.
La fonction du HAL pour recevoir un caractère est la suivante :
/**
* @brief Receives an amount of data in blocking mode.
* @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
* the received data is handled as a set of u16. In this case, Size must indicate the number
* of u16 available through pData.
* @param huart Pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @param pData Pointer to data buffer (u8 or u16 data elements).
* @param Size Amount of data elements (u8 or u16) to be received.
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Première question : pourquoi pData
est un uint8_t
et non un char
? Serais-ce parce que mon microcontrôleur est 32 bits et qu’il faut s’assurer que ce soit 8 bits ? (Je pensais qu’un char était 8 bits quoiqu’il arrive).
Le livre que j’utilise (Mastering STM32) m’explique comment l’utiliser et j’arrive avec ce code :
uint8_t readUserInput()
{
char readBuffer[1];
HAL_UART_Receive(&huart2, (uint8_t*)readBuffer, 1, HAL_MAX_DELAY);
return atoi(readBuffer);
}
void processUserInput(uint8_t op)
{
if (op == 1) {
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
if (HAL_GPIO_ReadPin(LED_GPIO_Port, LED_Pin) == 1) {
HAL_UART_Transmit(&huart2, (uint8_t*)msg_led_on, strlen(msg_led_on), HAL_MAX_DELAY);
} else {
HAL_UART_Transmit(&huart2, (uint8_t*)msg_led_off, strlen(msg_led_off), HAL_MAX_DELAY);
}
}
}
- Pourquoi un tableau d’un seul caractère
char readBuffer[1];
? Comme on va retourner et utiliser un pointeur versuint8_t
, ça ne serait pas plus simple de faireuint8_t *readBuffer
? - Si je remplace 1 par 166 (le code ASCII de t), ça ne fonctionne pas. Je pense que le problème vient de la conversion du
char[]
enuint8_t*
ou de la fontionatoi
. Qu’est-ce que je dois mettre à la place deop == 1
pour que ça fonctionne avec la touche t ? Pourquoi ?
Merci pour votre aide, en vous souhaitant une bonne fin de journée.