Синхронизация передачи данных по UART
- Войдите на сайт для отправки комментариев
казалось бы, задача простая и ранее много обсуждаемая
передаю с одного устройства (esp32) на другое данные. пакеты по 22 байт
отправление:
if (Serial2.availableForWrite() >= 22) { Serial2.write(raw+4,22); //delay(5); }
получение:
// сторона B - принимаем по uart дпнные while ((k=Serial2.available()) >= 22) { Serial2.readBytes(raw+4, 22); PrintHexBuffer(raw+4, 22); } //дочитываю в мусор неполный пакет... if (k > 0){ Serial2.readBytes(tmp, Serial2.available()); //PrintHexBuffer(tmp, 22); }
В итоге передача работает. но раз в несколько секунд пакет передаётся не полностью
меньше 22 байт и попадает в мусор.
есть вариант если меньше 22 байт в буфере приема, то ждать пока не наполнится 22.
но он мне не подходит, потому что задержка недопустима.
delay больше 10мс недопустимо использовать ни при отправке, не при приёме.
Я пробовал сделать задержку, с ней тоже также работает.
Вопрос, как грамотно синхронизировать обмен данными, и при этом:
1. не теряя данные
2. не добавляя delay
3. чрезмерно не усложняя код, т.е. передача только в одну сторону, не наворачивать двусторонним обменом с проверкой контрольной суммы и т.д...
это только пример , а не реализация
Использовать признак конца или начала пакета.
а если символ конца пакета выпал в шлак например через переполнеие буфера? и пошел прием второго пакета?
Мне кажется лучше принять байт начала пакета, потом 22 байта даннных, а потом если 24 байтом пришел байт конца пакета, то можно считать пакет сьедобным и обрабатывать... если нет, ждать начало следующего пакета. Тоесть юзать и начало и конец пакета....
ну про контрольные суммы наверно лишнее будет... хотя смотря че эти пакеты будут делать...
код приемника и передатчика. используются сообщения вида: 0xАА 0x55 размер_тела сами_данные КС(сложение)
Если качество связи таково, что выпадают байты, то нужна контрольная сумма. Если выпадает признак конца, то и признак начала может отвалить или любой информационный байт.
Берется циклический буфер на 23 байта, туда складываются байты и одновременно накапливается контрольная сумма. Если КС не совпадает, а пришло уже больше 23 байт, первый пришедший вычитается из кс и продолжаем пока пришедший байт не совпадет с контрольной суммой. Как только это чудо произошло - мы получили пакет. Обрабатываем его и очищаем буфер, а точнее обнуляем счетчик байт и кс. Ждем следующий пакет.
Может для начала разобраться что происходит? Откуда этот шлак берётся? Почему нормально не приходит?
Давайте, снимайте завесу секретности. Кто передаёт, кто принимает (аппаратура и скетчи), расстояние, схема соединения, всё подробненько. Скетчи полностью, а не огрызки, ибо откуда мы знаем, это передача сбоит или изначально данные так подготовлены (с мусором) а передаются правильно? Тоже, ведь, возможно.
А то Вам ту уже советуют не насморк лечить а сопли пылесосом отсасывать.
всегда детям так насморк лечил - очень действенно, есть приблуда специальная к пылесосу. Так что я за пылесос с КС и т.д.
Ну я не сильно верю, что при простом сериале данные могут теряться. Другой вопрос, если доказано, что сие имеет место быть нужно смотреть что будет в результате обработки неправильных данных. И как в дальнейшем эти пакеты должны синхронизироваться, то же не понятно. На вскидку я бы сделал что то такое:
Ногами не пинать , могут быть ошибки. Лениво у себя искать рабочий пример. Можно сделать красивее, если буфер расширить до размера кратного степени двойки. Думаю это все знают.
Да ну помехи ж никто не отменял. я думаю от туда и берутся.. ИМХО. у меня например в блютузсериал тоже время от времени выскакивает левый байт... хз. не стал я глубоко копать просто проверяю че пришло, шлак в мусор. правда у меня там пакеты по 3 байта.
Да ну помехи ж никто не отменял. я думаю от туда и берутся.. ИМХО. у меня например в блютузсериал тоже время от времени выскакивает левый байт... хз. не стал я глубоко копать просто проверяю че пришло, шлак в мусор. правда у меня там пакеты по 3 байта.
Дико извиняюсь.... Какие помехи ? Холодильник рядом работает ? Намного проще и правильнее избавится от помех, чем программно их фиксить. Если цифровой интерфейс полон мусора, то место ему в момойке, вместе с мусором.
Ну я не сильно верю, что при простом сериале данные могут теряться.
Могут ) лично проверял когда перешел с ардуины на есп. Есп стал сильно бытсро слать данные в порт так как моща выросла, и битрейта на передачу уже не хватило.. в итоге через переполнения буфера все че не влезо в него улетало в игнор. Плата менялась с частотником по MODBUS на одном из HardwareSerial.
А еще могут из за того что приемник не успевает их принимать... там тоже буфер не безразмерный..
Да ну помехи ж никто не отменял. я думаю от туда и берутся.. ИМХО. у меня например в блютузсериал тоже время от времени выскакивает левый байт... хз. не стал я глубоко копать просто проверяю че пришло, шлак в мусор. правда у меня там пакеты по 3 байта.
Дико извиняюсь.... Какие помехи ? Холодильник рядом работает ? Намного проще и правильнее избавится от помех, чем программно их фиксить. Если цифровой интерфейс полон мусора, то место ему в момойке, вместе с мусором.
То что правильнее - согласен. То что проще - ни разу.
если гаджет питается от батареек то может помех будет меньше чуть чуть))) а если от бп и сети то будут... холодильник работает в той же сети. А еще космические лучи.. могут случайным образом активировать или деактивировать ячеку памяти. А еще мабила может лежать рядом.. госпади в нашем мире источников помех столько что даже не перечислить... Почему ж тогда в в большинстве устройств после апаратной корекции ошибок (например оперативная память с поддеркой ЕСС) используют еще програмный контроль и коррекцию... наверное их не дураки придумывали
Не знаю, что у вас за схемотехника. Ни разу за 30 лет не видел беспричинно глючного последовательного интерфейса. Если все так плохо переходите на RS485.
ESP не исключение. И работают в таких условиях, что там мухи дохнут от магнитных полей.
А ну вы же счаз начнете рассказывать, что я вам не так помогаю, не тот фреймворк, экспрессиффф козлы и вообще.... :)
Я в курсе. Собсно modbus протокол и работает поверх апаратного rs485. Но обмен есп и микрухи max485 всерано по uart. Но помехи жеж нк только в проводах возникают... а и на саной плате и внутри чипа могут наводки быть. Не зря ж всякие кондерчики rc lc фильтра ставят... как не крути а без програмной коррекции и контроля не обойтись. Даже тот же модбас обратно шлет контрольную сумму принятых данных чтоб сверить ее с отправленой, даже при том что rs485придумат так чтоб работать где мухи дохнут.
Я знаю в чем ваша проблема. Но вы как всегда не показываете свой код. А мне , очень интересно как вы на есп контролируете опустошение аппаратного буфера UART для правильного переключения направления передачи на MAX485 :))))))
Что нет во "фреймворке" драйверов 485 интерфейса :) Это вам не дуплекс :)
А ну вы же счаз начнете рассказывать, что я вам не так помогаю, не тот фреймворк, экспрессиффф козлы и вообще.... :)
Соскучились по срачу?))) Так то в этот раз вы не мне помогаете если че. А то что вы не встечали совсем не значит что их нет)))
Так а че вы тогда тут свои три копейки вставляете ? Пишите по делу, или как там у вас... "Вали мимо " :) Где ваше "по делу" ?
"Нахрен лесом молча" там было))) раз уж беретесь цитировать то соблюдайте соответствие оригиналу. В правилах не написано что мне низя всталять пять копеек. Вот и вставляю. Человеку мож помогу а че низя было? Офтопить кстате вы начали. И деструктив тоже. А я все писал по теме
По какой теме ?
Синхронизация передачи данных по UART
По этой ? То что у вас там какие то помехи где то :)))) Может все же лесом ?
Так ладно, я пример ТС дал, все остальное оффтоп, только в ответ на вашу ерунду про помехи. Не засоряйте тему.
Согласен. Помехи хрень полнейшая их надо искоренять. Лесом так лесом. Буду за Вами. Доброй ночи.