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

Прошивка TCP2UART переходника с настройкой по Web

Почти ни как. Расчет идет на соединение в качестве удлинителя. На одно модуле ставите AP, а на другом ST и указываете ip адрес (и порт TCP2UART) первого модуля...
Передать пару байт через web можно в запросе, через переменные, как указано в http://sesp8266/sample.htm.
Прямо в регистры UARTx :) :
http://aesp8266/web.cgi?sys_ram0x60000f00=0x48&sys_ram0x60000f00=0x69&sys_ram0x60000f00=0x21 передает в UART1(debug port): 'Hi!'
http://aesp8266/web.cgi?sys_ram0x60000000=0x48&sys_ram0x60000000=0x69&sys_ram0x60000000=0x21 передает 'Hi!' в UART0 TX.
Так подождите , почему "почти никак" ? Получается "еще как"! ;)
Мне надо просто прикрутить веб морду к девайсу на стм32, и управлять настройками через веб. И получать параметры из устройства . Вот и вся задача.. Максимум десяток байт нужно слать и получать.
 

pvvx

Активный участник сообщества
Так подождите , почему "почти никак" ? Получается "еще как"! ;)
Мне надо просто прикрутить веб морду к девайсу на стм32, и управлять настройками через веб. И получать параметры из устройства . Вот и вся задача.. Максимум десяток байт нужно слать и получать.
Для этого каждый раз требуется спец.протокол, а тут TCP2UART, а не WEB-HTTP-UART. На Web нет стандарта для пересылки данных RS-232.
Исходники даны, но как прикрутить многопользовательский Web-HTTP к однопользовательскому UART пока никто не смог решить, кроме как Arduino-вцы и прочие, которым всё равно, главное написать блог о мигании светодиодом :)
 

dosikus

Member
pvvx, видимо небольшой ликбез все-таки нужен. :)
Как пользоваться Save Test Wav?
У меня просто сохраняет файл с расширением wav c содержимым ~test_adc~ .
 

pvvx

Активный участник сообщества
pvvx, видимо небольшой ликбез все-таки нужен. :)
Как пользоваться Save Test Wav?
У меня просто сохраняет файл с расширением wav c содержимым ~test_adc~ .
Значит при сборке диска была не задана опция трансляции *.wav:
tstwav.gif
(возможно я пропустил и недоглядел при сборке...)
При внешних опциях в make_webfs.bat: PVFS2.exe -h "*.htm, *.html, *.cgi, *.xml, *.bin, *.txt, *.wav" -z "*.inc, snmp.bib" .\WEBFiles .\webbin WEBFiles.bin

Динамические файлы - это для которых ставиться атрибут в WEBFiles.bin, указывающий что они должны "парситься" при передаче, если в них программой PVFS2.exe будут найдены переменные заключенные в "~". В остальных файлах поиск динамических переменных не производится и они могут быть сжаты GZIP при помещении в WEBFiles.bin.

Тестовый wav - это просто генерация маленького wave файла, как простейший пример для 'демки' работы с ADC (для тех кто копает в исходниках).
 
Последнее редактирование:

Vasay

New member
Здравствуйте!

pvvx, спасибо за прошивку!

У меня вопрос: при передачи данный (> 5 kБ ) в UART на скорости 3076923 бод каждый раз после определенного количества данных ( примерно 4.5 kБ) возникает пауза примерно 188мс. пробовал на других скоростях эффект тот же. В Wireshark не чего плохого не увидел.
ESP8266 соединен с компьютером на котором стоит Tibbo. с Tibbo использовал другой китайский wifi модуль таких задержек не было.

Я так понимаю ESP чем-то занят. или чего то ждет.

Подскажите с чем это может быть связано и можно ли эту задержку убрать (ведь дальше при передачи данных большего размера такой задержки больше не возникает)?

прикреплен файл (передаю в UART 16 kБ):
желтый луч RxD ESP
синий луч RTS ESP

С прошивкой AT v0.25 такого нет. Но там почему то не ставится скорость больше чем 115200*13 (~1500000)
 

Вложения

Последнее редактирование:

Sergey476

New member
добрый день,
подключил TCP2UART к GPS приёмнику по ком порту на скорости 4800. данныепринимаю через wifi программой nmearouter. Программа раз в несколько секунд выдаёт ощибку осуствие CR,LF. при этом довольно стабильно и в одноми том же месте.Пробывалпрошивки от 0.39 до 0.44 -результат такой-же.Хотел протестировать стандартную прошивку, но не понял как задавать at через Tcp , ведь uart будет занят под передачу данных.
 

pvvx

Активный участник сообщества
возникает пауза примерно 188мс.
Существует завязка с режимом WiFi-sleep. В старых прошивках по умолчанию ставился режим NONE, в новых MODEM. Это может влиять на возникновение пауз. Попробуйте поставить NONE.

С прошивкой AT v0.25 такого нет. Но там почему то не ставится скорость больше чем 115200*13 (~1500000)
Возможно что-то связанное с закрытой частью китайского SDK. С последними новыми версиями SDK я полного теста не делал. Ранее были какие-то провалы, но реже.
 

pvvx

Активный участник сообщества
добрый день,
подключил TCP2UART к GPS приёмнику по ком порту на скорости 4800. данныепринимаю через wifi программой nmearouter. Программа раз в несколько секунд выдаёт ощибку осуствие CR,LF. при этом довольно стабильно и в одноми том же месте.Пробывалпрошивки от 0.39 до 0.44 -результат такой-же.
Скорее всего nmearouter ожидает что ему будут приходить пакеты с полной строкой от GPS, заканчивающиеся CR, LF. А при приемо-передаче данных UART - TCP используется ожидание всего 50 ms до донабора пакета передачи. При этом, если за это время (50ms) данные не набрались, то произойдет отсылка того что есть. В итоге поток может быть нарезан как угодно и в пакетах могут попадать неполные строки GPS (начало строки в текущем пакете, а конец в следующем). Т.к. nmearouter работает и с UDP, то он явно ведет неполноценный потоковый прием, а работает на пакетном принципе. Т.е. он не совместим с стандартными поточными приемо-передатчиками, коим и является данный TCP2UART.
Возьмите исходники и скорректируйте задержку времени отсылки неполного буфера в tcp2uart.h под вашу задачу:
[HASHTAG]#define[/HASHTAG] MAX_WAIT_TX_BUF 50000ul // 50 ms
Это может помочь, но не гарантирует совместимости с недоделанным TCP приемником у nmearouter.
 
Последнее редактирование:

Sergey476

New member
Возьмите исходники и скорректируйте задержку времени отсылки неполного буфера в tcp2uart.h под вашу задачу:
[HASHTAG]#define[/HASHTAG] MAX_WAIT_TX_BUF 50000ul // 50 ms
Это может помочь, но не гарантирует совместимости с недоделанным TCP приемником у nmearouter.
Спасибо за идею.Но к сожалению проблема наблюдается не только с nmearouter, но с програмой для android GPSbridge. Она через некоторое время блокируется из ошибки в данных.Самое интересное, что nmearouter выдает ошибку всегда только на первую строчку в пачке GPS данных .
 

Vasay

New member
Изменение Sleep Mode результата не изменил. (у меня модуль настроен на SoftAP)

Если посылаю меньше или равно 4638 байт - все хорошо
при посылки 4640 байт - отсылается примерно 4 360 байт затем возникает пауза примерно 180-200 мс потом остаток примерно 280 байт
 
Последнее редактирование:

pvvx

Активный участник сообщества
Изменение Sleep Mode результата не изменил. (у меня модуль настроен на SoftAP)

Если посылаю меньше или равно 4638 байт - все хорошо
при посылки 4640 байт - отсылается примерно 4 360 байт затем возникает пауза примерно 180-200 мс потом остаток примерно 280 байт
3*MSS = 3*1460 = 4380. Т.е. три полных TCP пакета и 280 - это не полный 4-ый пакет. Lwip "съедает" 2*MSS - это буфер у него отсылку сразу 2-х пакетов. 3-й кусок (1460+xx) остается в буфере TCP2UART. Далее приходят ваши 280 байт, за это время (или около) отсылается третий пакет TCP, и на этих ~300 байтах система встает на ожидание выше описанных 50ms, в надежде добить пакет. Задержка на отправку более 50ms, после приема последнего байта вашего блока в 4,5 кило делает уже LwIP и приемная сторона. Существует пару типов приема и оптимизации скорости TCP стеков - один метод: Передатчик отправляет сразу 2 пакета TCP и ждет подтверждения приема от приемника (ACK) (Google Chrom) или простой метод - подтверждается прием каждого пакета (MS Explorer). Буфер у Lwip мал и пока он не подтвердит передачу своего стека (2*MSS) он не может предавать новые данные... Т.ч. в данной задержке может быть завязана и приемная сторона, т.к. кол-во пакетов не кратное ...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Спасибо за идею.Но к сожалению проблема наблюдается не только с nmearouter, но с програмой для android GPSbridge. Она через некоторое время блокируется из ошибки в данных. Самое интересное, что nmearouter выдает ошибку всегда только на первую строчку в пачке GPS данных .
Но это всё GPSbridge, а они обычно отсылают пакеты с полными строками, заканчивающимися CR/LF для совместимости с UDP передачами. Скорость у вас низкая, TCP2UART должен передавать и редко идущие байты (нажатия клавиш) и непрерывный поток на пределе TCP (для этого желательно собирать и отсылать по возможности полные пакеты), по тому и стоит задержка в 50ms... За 50ms на 4800 передается всего 2,5 байта.
 
Последнее редактирование:

Tomahawk

New member
Извиняюсь, но на 4800 работать при текущих возможных скоростях это извращение какое-то :) Я бы другие варианты поискал, если 4800 это предельная скорость работы из-за помех или чего-то ещё.
 

pvvx

Активный участник сообщества
Извиняюсь, но на 4800 работать при текущих возможных скоростях это извращение какое-то :) Я бы другие варианты поискал, если 4800 это предельная скорость работы из-за помех или чего-то ещё.
Distance.gif
Ну наверно там дистанция от GPS до ESP8266 пол километра... :)
 

Vasay

New member
Lwip "съедает" 2*MSS - это буфер у него отсылку сразу 2-х пакетов. 3-й кусок (1460+xx) остается в буфере TCP2UART. Далее приходят ваши 280 байт, за это время (или около) отсылается третий пакет TCP, и на этих ~300 байтах система встает на ожидание выше описанных 50ms, в надежде добить пакет.
Не совсем так.
если смотреть направление UART - ESP8266-WiFi

Первый пакет приходит (отправляется ESP8266) не 1460 а 125 байт после чего, я так понимаю, верх перед отправкой подтверждения ждет примерно 200мс (ждет пока пакет в 1460 байт наполнится).
Time --------------- Info
8.596119000 ------ 4097→20000 [PSH, ACK] Seq=1 Ack=1007 Win=5363 Len=124
8.795567000 ------ 20000→4097 [ACK] Seq=1007 Ack=125 Win=63955 Len=0

Тоже самое происходит в конце передачи, когда остаток отправляемых данных не 1460 байт.

Получается в начале передачи 200мс и в конце 200мс, 400мс уходит.

Вопросы:
1) Почему размер первого пакета 125 байт (иногда 124 байта), а не пакет в 1460 байт? (передача в ESP идет непрерывно)
2) Если выставлен флаг PSH почему идет ожидание 200мс? ( но это скорее вопрос к верху)
3) Как можно этого избежать ?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Не совсем так.
если смотреть направление UART - ESP8266-WiFi

Первый пакет приходит (отправляется ESP8266) не 1460 а 125 байт после чего, я так понимаю, верх перед отправкой подтверждения ждет примерно 200мс (ждет пока пакет в 1460 байт наполнится).
Time --------------- Info
8.596119000 ------ 4097→20000 [PSH, ACK] Seq=1 Ack=1007 Win=5363 Len=124
8.795567000 ------ 20000→4097 [ACK] Seq=1007 Ack=125 Win=63955 Len=0

Тоже самое происходит в конце передачи, когда остаток отправляемых данных не 1460 байт.

Получается в начале передачи 200мс и в конце 200мс, 400мс уходит.

Вопросы:
1) Почему размер первого пакета 125 байт (иногда 124 байта), а не пакет в 1460 байт? (передача в ESP идет непрерывно)
2) Если выставлен флаг PSH почему идет ожидание 200мс? ( но это скорее вопрос к верху)
3) Как можно этого избежать ?
Да, первый блок, после паузы приема по UART-RX более 50 ms отсылается сразу, не дожидаясь ничего. Требуется для исключения задержки в запросо-ответных системах и типа передачи скана "кнопок".
Но ожиданий более пары десятков ms при работе UART на 3Mb/s я не наблюдаю.
Вот пример конца первого блока и начала отсылки второго:
end_start.gif
Время указано в промежутках до следующего. Вот перед последними блоками 274-275 и видим паузу ожидания "добора пакета" на 50ms.
Все остальные паузы рождены временем подтверждения TCP пакетов приемником.
Пример начала передачи в RX-UART на 3Mb/s блока на 64 килобайта (с начальным открытием соединения):
pause60.gif
Пакет N60 - подтверждения от стека TCP на компе сделал паузу в 208 ms, не давая модулю передавать дальше. Причина - он ожидал другого метода оптимизации передачи.

На вопрос 3), если он о начальном коротком пакете, то поставить сравнение, если время от последней передачи значительно более 50ms, то не передавать пока буфер не заполниться до размера свободного объема у LwIP. Но надо ещё как-то сравнивать идет ли дальнейшая передача...
Что-то типа: if((time_us - old_time_send_tx) > ((3*MAX_WAIT_TX_BUF)/2)) old_time_send_tx = time_us; в 90 строку tcp2uart, что тоже не совсем корректно... т.е. для ускоренной передачи блоков фиксированной длины на фиксированной скорости UART, да с учетом метода приемного стека TCP и ограничений LwIP в модуле требуется написание специализированного, адаптирующегося (меняющего размеры пакетов под скорость UART и соединения TCP) и разбирающего массу вариантов алгоритмов стека TCP приемной стороны... а такое лень делать. :)
 
Последнее редактирование:

Vasay

New member
Все задержки из-за стека TCP на компе.

Время между посылками модулю ESP8266 (по линии UART) у меня больше чем 50ms. Вот и получается что первый пакет данных модуль отсылает данные не набрав буфер (почему то получилось 124-125 байт). И как вы сказали из-за какой-то оптимизации (я так понял ждет пока заполнится буфер стека TCP на компе) и происходит задержка. Комп не отсылает подтверждения в течении 200ms.

Не понятно почему стек TCP на компе чего то ждет если в TCP пакете выставлен флаг PSH

Но ожиданий более пары десятков ms при работе UART на 3Mb/s я не наблюдаю.
На линии первая задержка видна когда заполняются буфер LwIP и UART. вторую можно увидеть только снифером. Задержка после первого и последнего пакета из за стека TCP на компе.( Ваша вторая картинка номер пакета 59 (первый пакет при передачи посылки с паузой более 50ms).)

Получается что если мне надо послать допустим 3500байт (рис. 122):
124 байт |задержка 200ms| - 1460 байт |маленькая задержка|- 1460 байт |маленькая задержка|- 462байт |задержка 200ms|


при скорости 3000000 бит/с отправка этого буфера по линии UART займет 13ms (10*4000/3000000)
и эта огромная задержка более чем 400мс. (в итоге скорость 80 000 бит/с).


Вопрос:
1) Использовал Tibbo настроек не нашел. Накидал свою программу работы с сокетами. Убрать задержку (оптимизацию) не получилось. (интересно что перед отправкой ACK последнего пакета иногда ждет 200ms а иногда нет. )
Не подскажите как эту оптимизацию выключить?

2)Почему именно 124 -125 байт первая посылка после паузы на линии UART-RX более 50 ms?
не логичнее было бы дождаться например разрыва посылки? (задержка между байтами на линии RX больше чем определенное значение например 10/rate или 5/rate (задержку привязать к скорости)).
 

Вложения

  • 43.6 KB Просмотры: 43

pvvx

Активный участник сообщества
Не понятно почему стек TCP на компе чего то ждет если в TCP пакете выставлен флаг PSH
Алгоритм TCP стека такой. Он разнится, если использовать разные либы в Windows.


1) Использовал Tibbo настроек не нашел. Накидал свою программу работы с сокетами. Убрать задержку (оптимизацию) не получилось. (интересно что перед отправкой ACK последнего пакета иногда ждет 200ms а иногда нет. )
Не подскажите как эту оптимизацию выключить?
Передавать всегда 2-мя пакетами. "Технология TCP с отложенным подтверждением", упоминается в https://ru.wikipedia.org/wiki/Алгоритм_Нейгла
2)Почему именно 124 -125 байт первая посылка после паузы на линии UART-RX более 50 ms?
не логичнее было бы дождаться например разрыва посылки? (задержка между байтами на линии RX больше чем определенное значение например 10/rate или 5/rate (задержку привязать к скорости)).
Логичнее дождаться, но необходимо несколько таймеров и более сложный код. Со скоростью UART требуется связывать и не только то, что описываете, что ведет к сильному усложнению и увеличению кода. Но CPU ESP8266 и его оборудование уже не справляется со скоростью UART 3Mb/s с обработкой TCP. Это практически предельная скорость обслуживания UART по прерываниям с работающим TCP для получения непрерывного потока по TX и RX с уже отключенными всякими командами "memw" (синхронизации с шиной) через опции транслятора (это не используют все другие прошивки, кроме данной и у них ещё хуже). Проблема заключается в медленной шине (26MHz) к UART и другим регистрам периферии. Большую часть времени CPU занимает ожидание чтения значений по шине от UART (при 160MHz CPU чтение регистра UART = 6 или 7 тактов). DMA для UART не дано. Памяти у чипа мало - малы буферы, на каждый принятый-отосланный байт уходит много кода, а работа TCP (обработка WiFi и работа LwIP у китайцев не оптимизирована под данную структуру CPU). Полудуплексный TCP трансфер модуля на частоте CPU в 160 MHz составляет в пике к 1,5 Мегабайт в секунду, если нет активной работы с регистрами периферии и всё максимально оптимизировано (кроме закрытого китай-кода, т.к. исходников к ним нет). Всякие Arduino уже не могут дать и 200 кило в секунду, а при работе с UART - вообще смешно...
В совокупности и выходит вывод - делайте специализированную под вашу задачу систему. Она будет отличаться от текущей системы TCP2UART оптимизированной на нечто средние...
 
Последнее редактирование:

Sergey476

New member
Извиняюсь, но на 4800 работать при текущих возможных скоростях это извращение какое-то :)
Дело в том, что скорость определяется необходимым объемом передаваемой информации,а не достижением в скорости UARTa. Очень много датчиков (топлива, скорости, давления, радаров, ускорения и т.д.) работают по стандарту NMEA0183 в котором скорость по умолчанию 4800. Этой скорости им за глаза достаточно. Передалывать эти датчики на скорость 115к или 3м никто не будет т.к. не понимает зачем.
С низкими скоростями действительно сейчас большая проблема. 1 байт на скорости 4800 выходит из Com порта за 2мс. Т.е. при прямом подключение датчика к компьютеру компьютер начнёт получать данные с задержкой 2 мс. При подключении через TCP2UART задержка первого байта составит 2мс*125=250 мс. т.е. задержка становиться больше чем в 100 раз. Это очень грустно ,что используя скорости в wifi 802.11n мы не можем передать самый медленный интерфейс.
Я бы другие варианты поискал, если 4800 это предельная скорость работы из-за помех или чего-то ещё.
Предложите... Задача следующая:Есть GPS приёмник, который выдаёт данные в NMEA. Есть Спидометр, компас, компьютер, планшет которые должны одновременно эти данные принимать и обрабатывать.растояние не более 5 метров.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Предложите... Задача следующая:Есть GPS приёмник, который выдаёт данные в NMEA. Есть Спидометр, компас, компьютер, планшет которые должны одновременно эти данные принимать и обрабатывать.растояние не более 5 метров.
При 4800 скорость приема положения, к примеру у автомобиля, да с включенным green/low power GPS (получение всего одной точки в секунду) уже не достаточна для передачи человеку данных о скорости автомобиля голосовыми сообщениями :) Набегает уже значимая для человека задержка (более 0.2 сек,в случае управления кнопкой - если задержка более - то кнопку просто разобьют :p, а GPS в low-power (выдача менее 8 точек в сек) дает уже сама задержку к 1 сек :) а её система фильтрации и предсказания уведет вас в столб на 100% :) ). В итоге такая система, как описываете, может годиться только для логирования мрашрутов, записи истории и т.д., но не для интерактивного приложения. (Из опыта создания систем голосового оповещения в авто, когда GPS только вводилось, но ещё было запрещено использование точности менее +-100 метров на территории России... Не думаю, что-то сильно изменилось :) )
Да - нормальная GPS дает более 500 точек в секунду - как она их передаст на 4800 Baud в 'aски' символах ? ;)
В связи с этим вашему приложению всё равно какая задержка передачи - она всё равно будет ниже чем получаемые с таких GPS данные (и их достоверность при движении).
+ Сколько не брали датчиков, у всех есть команды переключения скорости вывода. Так-же 80% из них имеют систему встраивания собственного кода (SDK/DDK и т.д.).
Фиксированная скорость типа 4800 или 9600 в них сделана для залива конфига или прошивки, после сброса их параметров... и то, это актуально для устаревших моделей.
В большинстве новых используется 115200. Примеры: http://naviaglonass.ru/
 
Последнее редактирование:
Сверху Снизу