ESP8266 потери при приёме через UART

Dimak

New member
Приветствую!
Помогите пожалуйста разобраться в чём может быть причина.
Я передаю по UART от ардуины на esp8266 пакеты скажем по 160 байт. На esp принимаю эти 160 байт и записываю в файл. Если я передаю 100 таких пакетов с небольшими паузами, то по закрытию файла их оказывается только 70-80%. Т.е. принято не всё. В результате всестороннего тестирования оказалось, что esp пропускает начало передачи любого из пакетов и принимает не всё. Она на что-то отвлекается и я не могу понять на что. Пока не трогал Wi-fi принималось всё. Как только первый раз подключил её к сети, с тех пор она перестала принимать всё. На esp я использую LUA и следующий кусок кода отвечает за приём пакета:

uart.on("data, 160, function(data)
file.write(data)
end, 0)

Но! Теперь, даже если я отключаю Wi-fi модуль (статус показывает нуль, а на роутере нет подключения), картина не меняется - этот moth..fu..ed device просто съел мне мозг и он по прежнему отвлекается и пропускает некоторые передачи. Я менял скорости. На низких скоростях типа 9600 принимает в большинстве всё, но меня интересует скорость 115200 или 256к.
У ардуины и esp есть некоторое различие в скоростях, оно связано с разными тактовыми частотами. Во всяком случае у ардуины кварц 16МГц даёт около 3% ошибок при передаче на 115200, но ведь всё работало до начала использования Wi-fi.
Возможно я не достаточно отключаю Wi-fi, или что-то ещё не делаю, пожалуста, помогите советом на что обратить внимание.
 

pvvx

Активный участник сообщества
file.write пишет в SPIFFS?
При записи в SPIFFS, всё останавливается на время записи и стирания секторов Flash. Это может достигать в LUA и 1 секунды - зависит от размера SPIFFS и его фрагментации. В эти моменты программа в ESP8266 и WiFi не работают. Соответственно всё пропускают. В Lua это не исправить, не используя RTS/CTS у UART.
Ну и быстро протрете дырки в Flash, используя метод записи в SPIFFS...
Меняйте основной алгоритм. Данные из/в UART собирайте в RAM буфера и передавайте всегда по 2 блока TCP из ESP. Только тогда получите удовлетворительную скорость работы WIFI<->UART с любым сторонним приложением и меньшее кол-во пропусков символов. Без RTS/CTS пропуски всё равно неизбежны, т.к. обычно WiFi работает на несколько устройств и всегда в эфире есть помехи, а большие буфера в ESP не сделать из-за мало-RAM...
Не тот WiFi-SoC выбрали для WIFI<->UART и не ту среду программирования...
 
Последнее редактирование:

Dimak

New member
file.write пишет в SPIFFS?
При записи в SPIFFS, всё останавливается на время записи и стирания секторов Flash.
...
Не тот WiFi-SoC выбрали для WIFI<->UART и не ту среду программирования...
Спасибо.
Изучая Ваши посты понял, что Вы в этом хорошо разбираетесь.
Чесно говоря, не ожидал, что архитектура esp не позволяет решить такую казалось бы простую задачу.
А возможно ли нормально принимать по uart без RTS/CTS, если на esp я буду использовать код на Си под ардуино ide вместо Lua?
 
Сверху Снизу