понедельник, 20 февраля 2017 г.

HAL_UART_TxCpltCallback() и HAL_UART_RxCpltCallback() - это не обработчики прерываний (обработчики в HAL закопаны почище кащеевой смерти) это ФУНКЦИИ вызываемые ПОСЛЕ корректной отработки прерываний, соответственно в каком именно состоянии окажется железка на момент их вызова, знает только аллах, и если с передачей всё более менее предсказуемо - что передали то и передалось и в зависимости от режима либо ждём новой команды на передачу либо начинаем передачу самостоятельно, то с приёмом картина совершенно другая - за время обработки прерывания с портом может случиться всё что угодно и к моменту вызова этой функции (а в промежуток может вклинится всё что угодно, от других прерываний например) состояние оказывается в точности равно погоде на марсе...
Стабильные варианты это, либо блокировать порт на время приёма (в общем то глупое расходование машинных циклов на ожидание), либо использовать кольцевой режим буфера (но придётся забыть о достоверном событии завершения приёма). Всё остальное в той или иной ситуации способно остановить приём (а в SPL всё работало).
Получается в HAL нагородили костылей так, что аппаратный режим команда-отклик стал невозможен даже теоретически...

Комментариев нет :

Отправить комментарий