STM32 HAL USART recevoir par interruption

J'ai du mal à recevoir des données sur l'USART. Ce que je veux réellement à atteindre les ist, que je peux recevoir une commande de plus de USART avec de la longueur (seulement une longueur maximale possible). J'ai donc utiliser la routine d'interruption pour vérifier chaque caractère reçu, mais j'ai en quelque sorte toujours pas possible d'obtenir ce que je veux. La routine est appelée à chaque fois que je reçois un nouveau personnage, mais de toute façon HAL_UART_Receive_IT(&huart1,rx_data,buff_size_rx) n'est pas mise à jour en temps réel, alors je ne vois pas reçu de caractère lorsque je vérifie rx_data[pointeur], mais quelques temps plus tard, il est dans le rx_data tampon.

Ce que j'ai à ce jour:

int pointer =0;

...

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
    if ( USART1->ISR & UART_IT_TXE) {

    }

    if ( USART1->ISR & UART_IT_RXNE) {
        HAL_UART_Receive_IT(&huart1,rx_data,buff_size_rx);
        if(rx_data[pointer]=='
int pointer =0;
...
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if ( USART1->ISR & UART_IT_TXE) {
}
if ( USART1->ISR & UART_IT_RXNE) {
HAL_UART_Receive_IT(&huart1,rx_data,buff_size_rx);
if(rx_data[pointer]=='\0') {
pointer=0;
readCommand(rx_data);
clearBuffer(rx_data,buff_size_rx);
} else {
pointer++;
if(pointer>=buff_size_rx) {
pointer=0;
}
}
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
'
) { pointer=0; readCommand(rx_data); clearBuffer(rx_data,buff_size_rx); } else { pointer++; if(pointer>=buff_size_rx) { pointer=0; } } } /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ }
  • quel est le point de dupliquer le tampon de la mise en œuvre? BTW, vous ne pouvez pas appeler HAL_UART_Receive_IT de là, et ensuite appeler HAL gestionnaire d'irq qui l'appelle à nouveau. Faire nu registres ou HAL, pas les deux. De toute façon HAL pour la simple périphérique comme uart?
  • Qu'entendez-vous par dublicating le tampon de la mise en œuvre? J'aimerais réaliser cela dans HAL, mais j'ai vraiment pas trouvé de solution pour le moment. DMA serait bien, mais là, j'ai besoin d'une longueur fixe pour chaque commande ou l'utilisation d'un délai d'attente, ce qui n'est pas pris en charge par HAL pour une STM32F303K8T6.
  • Hal t-il. Vous ne devriez pas faire quoi que ce soit avec le buffet si vous utilisez hal. Je voudrais mettre en œuvre nus resister moi-même, mais il est de votre code, sans cette stupide de la bibliothèque. Combien de temps vos messages? Si bref il n'y a pas de point de DMA.
  • Bien que les messages ne sont que d'environ 16 caractères. Si j'utilise juste HAL_UART_Receive_IT, il va écrire les caractères de la rx_data tampon, mais je ne jamais voir si j'ai reçu un caractère nul et il agit comme un tampon en anneau, qui ne fonctionne que pour une longueur fixe.
  • Regarde le code que j'utilise pour recevoir arbitraire des données GPS here. Il utilise HAL, mais les raccourcis de l'interruption. Si je devais le refaire je vidage de HAL et d'aller à la plaine CMSIS.
  • OMI DMA pour les 16 octets n'est pas la peine
  • Soares nue registre, CMSIS n'est que le tas de définitions & certaines fonctions inline.
  • Yep, pas de bibliothèques.