• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Глюки UART0 в режиме приема

=AK=

New member
ESP8266 работает в связке с внешним микроконтроллером, получает от него команды и обменивается данными. Все в общем-то работает, но иногда сообщения к приходят не целиком, а обрезанные.

Сообщения идут в бинарной форме с байт-стаффингом, в стиле SLIP. То есть, начало сообщения обозначается своей уникальной парой байт ("старт"), конец сообщения - своей уникальной парой ("стоп"). Сообщения имеют переменную длину, от 16 до 300 байт данных в пакете.

Изредка длинные сообщения не доходят: начало пакета и часть тела приходят, а конец сообщения где-то пропадает. В скетче я это обнаруживаю, когда вместо ожидаемого "стопа" приходит новый "старт".

Поначалу такое происходило довольно часто. Это было, когда я вычитывал побайтно в основном лупе.

После того, как стал вычитывать блоками, проблема стала появляться реже:
Код:
  while (Serial.available() > 0)
  {
    ubuf_len = Serial.available();
   Serial.readBytes(ubuf, ubuf_len);
  ... etc
  }
Сейчас ре-организовал код при помощи TickerScheduler. Раз в 1 мс запускаю задачу, которая только читает блоками из , убирает байт-стаффинг и кладет данные в буфер, больше ничего не делает. Проблема стала появляться намного реже, но иногда все же возникает.

Чаще всего режутся пакеты длиной порядка 110 байт, обрезание происходит примерно на 90-м байте. Мне это удивительно, потому что аппаратный буфер у ESP имеет длину 128 байт, плюс к этому в драйвере есть буфер 256 байт. Что за фигня такая?
 

Юрий Ботов

Moderator
Команда форума
Рассинхронизация, скорость передачи отличается от скорости приема на 1/90, а адаптация скорости не побайтная а только в начале как вариант
 

=AK=

New member
Рассинхронизация, скорость передачи отличается от скорости приема на 1/90, а адаптация скорости не побайтная а только в начале как вариант
Мысль интересная. Только никак не могу представить, как такое может быть. UART - это побайтный обмен, т.е. для каждого байта "жизнь начинается заново" по старт-биту. Поэтому не играет никакой роли, сколько байт передается, один или тысяча, при рассогласовании бодовых скоростей вероятность глюка была бы одинаковой для каждого байта.
 

=AK=

New member
Организовал проверку. Пакеты покрыты CRC, каждый пришедший по UART небитый пакет ESP подверждает квитанцией, а микроконтроллер посылает пакет заново, если квитанция от ESP вовремя не пришла. Инoгда раза 3-4 приходится посылать одно и то же, пока достучишься до ESP.

Пока работал по ТСР в локальной сети, это было полбеды. А когда подключился через интернет к MQTT брокеру, стало совсем плохо. Теперь ESP не работает уже не десятки миллисекунд, а сотни. Иногда вплоть до секунды ESP живет своей жизнью и не реагирует на данные, приходящие по UART, теряет их напрочь.

Полное впечатление, что ESP выключает прерывание UART, пока обрабатывает TCP.
 
Сверху Снизу