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.