csm7 0 13 декабря, 2018 Опубликовано 13 декабря, 2018 · Жалоба Доброго времени суток! Использую библиотеку 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'. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 13 декабря, 2018 Опубликовано 13 декабря, 2018 · Жалоба я ответил в теме http://forum.easyelectronics.ru/viewforum.php?f=35 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 13 декабря, 2018 Опубликовано 13 декабря, 2018 · Жалоба Наверное надо сначала прочитать принятый байт из приемника, а потом уже разрешать следующее прерывание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
csm7 0 13 декабря, 2018 Опубликовано 13 декабря, 2018 · Жалоба Подобную идею реализовал но тщетно. Один байт принял, разрешил прерывание - остальные потерялись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 13 декабря, 2018 Опубликовано 13 декабря, 2018 (изменено) · Жалоба если HAL_UART_RxCpltCallback вызывается из прерывания USART, то в ней нужно только считывать очередной байт и записывать его в принимающий буфер. а уже в другом месте, например в main, анализировать этот приемный буфер и, при нахождении в нем нужной последовательности, формировать буфер ответа и стартовать USART на передачу. останавливать/стартовать заново прерывание не нужно. если у HAL если возможность отследить в прерывании USART флаг IDLE - то можно использовать его как признак конца передачи к контроллеру Изменено 13 декабря, 2018 пользователем Zeal0t Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться