В цехах чаще всего встречал устройства с протоколами Modbus и DCON. Для обоих из них, используя полноценные UART, имеющие прерывания RTO и по символу, очень просто реализуется приём и передача с использованием DMA. Была экзотика в виде Bitbus. Сейчас стал встречаться CAN с самописными протоколами.
P.S. Прерывание IDLE, вообще-то говоря, предназначено для детектирования ошибок при обменен по протоколу Modbus. В кастрированных UART его используют вместо RTO за неимением последнего.
Eddy_Em, tonyk, DMA и прерывания RTO и по символу '\n', все это хорошо, но опять смотря какая конечная цель. Если мы напрямую работаем через терминальную программу, то я бы хотел посмотреть как вы с прерыванием по символу '\n' организуете
ввод строки из консоли с примитивным редактированием при помощи backspace
смотрим короткое видеоСпойлер надеюсь достаточно показал
Dimon456, для консольного ввода отлично прерывания по символу работают, проверено. А вот если тайм-аут вставлять, понятное дело, работать будет неудобно. Но т.к. я обычно из терминала в режиме отладки (да и не только), прием у меня везде по прерыванию rxne. Заодно упрощается редактирование backspace'ом (правда, я себе на ncurses и readline терминал написал, там теперь не надо редактировать).
Если мы напрямую работаем через терминальную программу, то я бы хотел посмотреть как вы с прерыванием по символу '\n' организуете
А в чём сложность? У меня в МК консольный ввод идёт через кольцевой буфер, поэтому хоть RTO, хоть IDLE, хоть RXNE, да хоть USB-CDC можно использовать. Всё, что принято, помещается обработчиком прерывания в кольцевой буфер, а уже оттуда в задаче обработки консольного ввода вычитывается и обрабатывается.
tonyk писал(а):Всё, что принято, помещается обработчиком прерывания в кольцевой буфер, а уже оттуда в задаче обработки консольного ввода вычитывается и обрабатывается.
ну так давайте посмотрим ваш алгоритм, как он вычитывается и обрабатывается.
Здравствуйте, форумчане! Прошу совета в наиболее правильном варианте приема данных по uart на f103. Есть устройство, которое отправляет в stm пакеты данных частотой 10Гц, на скорости 115200кб/с. Мне нужен конкретный пакет объемом 100 байт с известным заголовком. Контроллер принимает данные используя прерывание и dma. Дальше мне нужно по заголовку пакета определить то ли это сообщение, которое я жду, и если да, то сравнить контрольную сумму и разложить данные в структуру. Здесь и возникает вопрос. В какой последовательности правильнее это делать? Пока вижу два варианта: 1. Принять весь пакет в буфер, сравнить заголовок, посчитать контрольную сумму и после этого разложить данные в структуру; 2. Принимать побайтно и сразу же сравнивать заголовок с шаблоном, а в случае успеха сразу раскладывать данные в структуру, после этого считать контрольную сумму. Если есть более логичные способы, буду рад услышать. Делается все дилетантом в качестве хобби, так что завышенных требований не предъявляется.