ну если уж вообще быть честным, то на скорости 9600. как мы уже выяснили время байта ~1ms у вас кортекс. заход в прервыние 12 тактов выход 12. плюс минус в прерывании. это просто мелочи...
ну если уж вообще быть честным, то на скорости 9600. как мы уже выяснили время байта ~1ms у вас кортекс. заход в прервыние 12 тактов выход 12. плюс минус в прерывании. это просто мелочи...
это заготовка Я потом её перенесу на modbus rtu, а сейчас делаю прием протокола попроще не вижу смысла 2 раза делать одно и то же
ну если уж вообще быть честным, то на скорости 9600. как мы уже выяснили время байта ~1ms у вас кортекс. заход в прервыние 12 тактов выход 12. плюс минус в прерывании. это просто мелочи...
во во. ещё бывают контроллеры с маленьким аппаратным фифо, там совсем хорошо будет
Я делал modbus на IDLE прерывании по UART'u и циклическом DMA. Там как раз можно по IDLE парсить пакет и смотреть на длины, CRC и прочее. Так и ложные срабатывания выявить относительно легко. И в случае ложного срабатывания заставить DMA дописывать недопринятые байты. Ну и если совсем все плохо, состояние всей этой красоты можно сбрасывать при заполнении счетчика DMA (известно, что длина пакета MODBUS ограничена), либо по тайм-ауту. Как раз около 10мс можно сделать
это заготовка Я потом её перенесу на modbus rtu, а сейчас делаю прием протокола попроще не вижу смысла 2 раза делать одно и то же
ну в модбасе тоже не все гладко. там нет длины, ее нужно вычислять + спец функции для своего железа или другого железа... + помехи или обрывы. таймер и принятие байта все равно нужно. так что сейчас ваше решение может и будет быстрее, но оно не будет проще
ну в модбасе тоже не все гладко. там нет длины, ее нужно вычислять + спец функции для своего железа или другого железа... + помехи или обрывы. таймер и принятие байта все равно нужно. так что сейчас ваше решение может и будет быстрее, но оно не будет проще
вы поймите есть такой бит RTO и он вот решает все вопросы с принятиям байт по времени прост в ф1 сейчас у меня его нет
Я делал так: запускаю dma на заголовок пакета * 2 по прерыванию половины заполнения буфера в нём же считаю длины и прямо в регистрах меняю значения размера буфера и адрес приёма данных + чищу флаги. Работало как часы=)