Jump to content

    

Прием данных по USART с использованием HAL + Interrupt

Доброго времени суток!
Использую библиотеку HAL для приема данных по USART с использованием прерываний.
Данные принимаются в функции HAL_UART_RxCpltCallback.

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
       {
         /* Receive one byte in interrupt mode */
         HAL_UART_Receive_IT(&huart3, rxUART3_byte, 1);

          if (huart->Instance == USART3)
            {
               *(pBuffer_UART3) = rxUART3_byte[0];
                  pBuffer_UART3++;
                      if (strstr(Buffer_UART3, "\r\n") != 0)
                         send_string_UART(&huart3, (uint8_t *)Buffer_UART3);
            }         
       }

Проблема в том, что приняв 1 байт, остальные теряются. Даже если тут же включается прием следующего байта функцией HAL_UART_Receive_IT(&huart3, rxUART3_byte, 1).

Подскажите пожалуйста как можно решить такую задачу. Если длина принимаемой посылки неизвестна но известно что посылка заканчивается символом '\r\n'.

Share this post


Link to post
Share on other sites

Наверное надо сначала прочитать принятый байт из приемника, а потом уже разрешать следующее прерывание.

Share this post


Link to post
Share on other sites

Подобную идею реализовал но тщетно. Один байт принял, разрешил прерывание - остальные потерялись.

Share this post


Link to post
Share on other sites

если HAL_UART_RxCpltCallback вызывается из прерывания USART, то в ней нужно только считывать очередной байт и записывать его в принимающий буфер. а уже в другом месте, например в main, анализировать этот приемный буфер и, при нахождении в нем нужной последовательности, формировать буфер ответа и стартовать USART на передачу. останавливать/стартовать заново прерывание не нужно. если у HAL если возможность отследить в прерывании USART флаг IDLE - то можно использовать его как признак конца передачи к контроллеру

Edited by Zeal0t

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this