Приветствую уважаемые участники сие ресурса!
Вопрос: Правильно ли я понимаю что прием пакета неизвестной длины по UART + RX IDLE + DMA - провальная концепция?
Проясню: Настраиваем UART на 115200, включаем прерывание по IDLE, за уши притягиваем DMA с парочкой настроенных дескрипторов, посылаем байтики и вроде бы все ОК, но DMA как и полагается все вычитывает из FIFO буффера, а прерывание по RX IDLE срабатывает только при наличии "тишины" в 4 байта на линии и НАЛИЧИЮ байтов данных в приемном буффере...
Итог: Посылка закончилась, DMA молодец ( частично ), IDLE не сработал.
Пупупу, поправьте меня конечно если я что-то где то упустил, но решения из ситуации пока не нашел, да и может "глаз замылился" с этим ВГ1Т.
P.S. Решил обыграть через WDT на канал DMA, аля если нет данных в течении N тиков, то срабатывает прерывание и мы там уже можем какую то хитрую логику покрутить зная бэкграунд, но при 115200 этот таймаут слишком велик и WDT срабатывает раньше чем фактический конец посылки.
К1921ВГ1Т UART + DMA
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
-
durimar_13
- Сообщения: 114
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: К1921ВГ1Т UART + DMA
Привет!
Я обычно не использую прерывание и прото ловлю признак конца посылки. Например \n или EOF, или еще что-то в этом роде.
Еще можно такой прием, как в Паскале: В первом байте (двух, четырех ...) передаете число - количество байт. Сначала побайтно выбираете это число, потом уже на его основе выбираете нужное количество байт.
Если у Вас чисто двоичный поток неизвестной длины и неизвестной кодировки - придется ловить прерывание по тайм ауту.
У простого UART есть только RX и TX сигналы. У модемного варианта - есть специальные сигналы готовности, можно их использовать. Но обычно на другой стороне канала связи такой возможности нет.
Хотя.. программист я так себе.
Я обычно не использую прерывание и прото ловлю признак конца посылки. Например \n или EOF, или еще что-то в этом роде.
Еще можно такой прием, как в Паскале: В первом байте (двух, четырех ...) передаете число - количество байт. Сначала побайтно выбираете это число, потом уже на его основе выбираете нужное количество байт.
Если у Вас чисто двоичный поток неизвестной длины и неизвестной кодировки - придется ловить прерывание по тайм ауту.
У простого UART есть только RX и TX сигналы. У модемного варианта - есть специальные сигналы готовности, можно их использовать. Но обычно на другой стороне канала связи такой возможности нет.
Хотя.. программист я так себе.
С уважением, Виктор.
-
durimar_13
- Сообщения: 114
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: К1921ВГ1Т UART + DMA
Помню, что для К1921ВГ015 в SDK есть пример работы UART-DMA в связке. Периферия у этих двух МК похожа, можно там подсмотреть.
Но я сразу отказался и от DMA для UART и от прерываний для UART.
Но я сразу отказался и от DMA для UART и от прерываний для UART.
С уважением, Виктор.
