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

Разработка ‘библиотеки’ малого webсервера на esp8266.

vad7

Active member
Подождите, если файл закачался нормально, то получаем сообщение из "/disk_ok.htm"
Лог:
Disk init: 69 files, addr = 0x0003d000 prh#f108,200,16 [HASHTAG]#f10a[/HASHTAG] (82) 302 dis
srv[80] 192.168.4.2:1561 [2] listen
memi[615] 0x00000000 rec 615 of 615 :
srv[80] 192.168.4.2:1561 [2] read: 615 http_ver=11 of1[disk_ok.htm] GET f[/disk_ok.htm] hcn:0x3fff01ff[0],wcn:93 tst_rx: 200, 0, 93 prh#2218,200,1 [HASHTAG]#2258[/HASHTAG] (201) 200 send: of2[timer.inc] cf2 of2[footer.inc] [sys_sysver]

А если, ошибка, то должен показаться "/disk_er1.htm"
А вот он то и не показывается! Файлы на диске есть, лежат в тех же местах, не пойму в чем дело.
 

pvvx

Активный участник сообщества
Подождите, если файл закачался нормально, то получаем сообщение из "/disk_ok.htm"
Лог:
Disk init: 69 files, addr = 0x0003d000 prh#f108,200,16 [HASHTAG]#f10a[/HASHTAG] (82) 302 dis
srv[80] 192.168.4.2:1561 [2] listen
memi[615] 0x00000000 rec 615 of 615 :
srv[80] 192.168.4.2:1561 [2] read: 615 http_ver=11 of1[disk_ok.htm] GET f[/disk_ok.htm] hcn:0x3fff01ff[0],wcn:93 tst_rx: 200, 0, 93 prh#2218,200,1 [HASHTAG]#2258[/HASHTAG] (201) 200 send: of2[timer.inc] cf2 of2[footer.inc] [sys_sysver]

А если, ошибка, то должен показаться "/disk_er1.htm"
А вот он то и не показывается! Файлы на диске есть, лежат в тех же местах, не пойму в чем дело.
Попробуйте internet explorer. И всё будет.
Я не могу отвечать за ошибки во всех эксплорерах. Дайте альтернативу, годную для всех, что им написать в ответе редиректа :)
 

vad7

Active member
Это браузера не зависит, проверил. Тут может быть в другом причина - передача файла уже начата, а мы тут редирект шлем, вот он и рвет соединение.
 

pvvx

Активный участник сообщества
Это браузера не зависит, проверил. Тут может быть в другом причина - передача файла уже начата, а мы тут редирект шлем, вот он и рвет соединение.
Это правильно, что ревет. Данных то может быть гегобайты, а ему ответили - иди в другое место. И писано это везде - во время приема сервер может послать куда угодно и когда угодно. :) Не ждать же слива всех данных, которых может быть бесконечность...
Вот ответ IE:
redir_ie.gif
Т.е. прямая зависимость от браузера.
 
Последнее редактирование:

vad7

Active member
Проверял на IE версии 8 (другой поставить не могу), FireFox 43, Chrome последний - на всех рвется соединение.
Видать они ждут что-то еще в таком случае, не силен в http.
Пока вижу, что нужно дописывать upload_boundary(), чтобы читал и пропускал входящий контент, а уж после редирект...
 

pvvx

Активный участник сообщества
Проверял на IE версии 8 (другой поставить не могу), FireFox 43, Chrome последний - на всех рвется соединение.
Видать они ждут что-то еще в таком случае, не силен в http.
Не знаю, что вы там проверяли, но вот и Mozilla Firefox:
redir_mf.gif
Беда только у Хрома
Пока вижу, что нужно дописывать upload_boundary(), чтобы читал и пропускал входящий контент, а уж после редирект...
Это противоречит http.
Скорее всего надо искать как и что вписать в ответ редиректа для Хрома. Может ему не нравиться 302. Меняют что хотят в google, чтобы потом не работало :) Вечная война друг с другом у них.
 
Последнее редактирование:

vad7

Active member
Обновил FireFox до последней 44.0.2 - та же ошибка, странно....
А есть еще и мобильные браузеры, которые вообще не обновишь.
 

vad7

Active member
Я все это пробовал с ноутбука с WinXP.
@Vitaly, антивирус отключен.
Попробовал с нового ноутбука с Win 10, IE 12, Chrome - работает!
Но как-то нестабильно - на маленькие файлы правильно ругается:
rv[80] 192.168.4.2:60016 [1] listen
srv[80] 192.168.4.2:60016 [1] read: 620 of254[/fsupload] content_len = 11213 of 0 'ESP8266:0123456789' POST f[/fsupload] ...
srv[80] 192.168.4.2:60016 [1] read: 1460 filename:'1.xlsx' head[83]:302 dis
srv[80] 192.168.4.2:60016 [1] error -8
srv[80] 192.168.4.2:60017 [2] listen
srv[80] 192.168.4.2:60017 [2] read: 494 of1[disk_er1.htm] GET f[/disk_er1.htm] head[201]:200 send: of2[timer.inc] cf2 of2[footer.inc] cf2 cf1 628 dis

А вот на средние и большие "подключение прервано":
srv[80] 192.168.4.2:60029 [1] listen
srv[80] 192.168.4.2:60029 [1] read: 620 of254[/fsupload] content_len = 90065 of 0 'ESP8266:0123456789' POST f[/fsupload] ...
srv[80] 192.168.4.2:60029 [1] read: 1460 filename:'2.xlsx' head[83]:302 dis
srv[80] 192.168.4.2:60029 [1] error -8
srv[80] 192.168.4.2:60029 [1] disconnect
cf254

Для проверки установил вашу последнюю прошивку с github.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Я все это пробовал с ноутбука с WinXP.
Попробовал с нового ноутбука с Win 10, IE 12 - работает!
Но как-то нестабильно - на маленькие файлы правильно ругается:
Ну надо найти и ликвидировать. Но проблема не в не ответе редирект. Он выдается, а что-то другое...
 

vad7

Active member
@pvvx, Подскажите есть функция вывода в UART, типа os_printf(), но чтобы выполнение программы дальше шло только после вывода всех символов?
 

vad7

Active member
Мне нужно как можно раньше установить обработчик прерываний GPIO.
Но вот тут обнаружил, что после функции uart_init() (в uart_tcp.c) обработчик прерываний больше не срабатывает.
Сам сходу не разобрался, подскажите, что в ней подправить?
 

pvvx

Активный участник сообщества
@pvvx, Подскажите есть функция вывода в UART, типа os_printf(), но чтобы выполнение программы дальше шло только после вывода всех символов?
После команды os_printf() ставите uart_wait_tx_fifo_empty() или user_uart_wait_tx_fifo_empty(uint32 uart_num, uint32 x), где x просто счетчик на ограничение времени ожидания вывода FIFO UART, если UART сидит на RTC-CTS. Можно сменить программу вывода putc() на стандартную .
Есть ets_uart_printf(), ets_external_printf(). Они все, как и ets_printf() и os_printf() (os_printf() в meSDK, у китайцев своя) могут иметь две процедуры вывода символа, например для лога и вывода в UART одновременно...
ets_external_printf() используется в потрохах WiFi у китайцев и к нему уже назнчены свои процедуры вывода работающие назначенные буфера... А жалко :(
См bios/ets.h
/* { putc1_routine = routine; } */
void ets_install_putc1(void *routine);
/* { putc2_routine = routine; } */
void ets_install_putc2(void *routine);
/* { ets_install_putc1(_putc1); } */
void ets_install_uart_printf(void); = ets_install_putc1(_putc1);
....
_putc1 назначена в ld. PROVIDE ( _putc1 = 0x40001dcc ); и в bios/uart.h. Выводит в UART0 c ожиданием вывода предыдущего символа, т.е. не использует FIFO. Она стоит по умолчанию в ets_printf(), после старта ROM-BIOS.
Никто не хочет писать Help к стандартным процедурам на ESP8266. Пишут Help только к известному внешнему ПО - к Ардуино например :)
 
Последнее редактирование:
  • Like
Реакции: vad7

vad7

Active member
@pvvx, спасибо.
Подскажите по функции uart_init()?
Чем в ней могут GPIO прерывания отключаться?
Не увидел в ней ничего такого...
Или ее может перенести куда-нить в начало startup() ?
 

pvvx

Активный участник сообщества
@pvvx, спасибо.
Подскажите по функции uart_init()?
Чем в ней могут GPIO прерывания отключаться?
Не увидел в ней ничего такого...
Или ее может перенести куда-нить в начало startup() ?
Есть git - там можно указать строку. А то искать долго.
И не понятно что вы хотите. uart_init() инициализирует UART-ы и вокруг этого дела ещё все связанные с ними "пины" согласно установленной конфигурации. Если UART1 отключена, то не инициализит её пины, если UART0 swap, rts-cts и т.д. то соответственно и ставит их функции.
Присвоение printf-у функции вывода там-же esp8266web/uart_tcp.c at master · pvvx/esp8266web · GitHub
Перенести нельзя - придется рвать на куски и отключать всякие Modbus и TCP2UART и т.д. Не будут устанавливаться их сигналы. А по делу надо как можно ранее установить их, назначить вывод отладки и т.д....
 
Последнее редактирование:

vad7

Active member
Вот сюда вставляю код установки обработчика прерываний GPIO:
esp8266web/app_main.c at master · pvvx/esp8266web · GitHub
И обработчик никогда не срабатывает.
Причем экспериментально выяснил, что дело в функции uart_init(), в ней что-то происходит с прерываниями GPIO.
 

pvvx

Активный участник сообщества
Нашел возможность появления ошибки в приеме TCP, но она не повязана с modbus TCP или web (вроде) - для проявления требуется непрерывная загрузка на полную приема по TCP и непрерывным потоком с управлением размера приемного окна, а не как в modbus TCP или простом web - каждое сообщение отдельный пакет TCP, а в web кусочная обработка потока реализована по другому. Завязка может проявиться в TCP2UART - вылет с протектед... Делал новый алго для TCP2UART, более скоростной и с пакетными возможностями - задействовал аппаратный определитель паузы между символами (UART_RX_TOUT_THRHD). С ним снимется задержка на накопление буфера... С ESP творятся странности, когда на 3 Мегабита через UART в TCP в обе стороны долго и непрерывно :) - иногда падет STATION и не восстанавливается до перезагрузки... китайцы...
 

vad7

Active member
@pvvx, в update_mux_uart0() порты настраиваются, а у меня на U0RXD (GPIO3) датчик висит. Вот, похоже, из-за этого и не работает.
В принципе, мне вообще UART0 не нужен. Нужен только UART1 и то только TX (GPIO2) для вывода в терминал для отладки временно, а на готовом девайсе - тоже нет.
Да, и бывает нужно выводить всю отладку только на UART0 (GPIO1).
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx, в update_mux_uart0() порты настраиваются, а у меня на U0RXD (GPIO3) датчик висит. Вот, похоже, из-за этого и не работает.
В принципе, мне вообще UART0 не нужен. Нужен только UART1 и то только TX (GPIO2) для вывода в терминал для отладки временно, а на готовом девайсе - тоже нет.
Да, и бывает нужно выводить всю отладку только на UART0 (GPIO1).
Ну и что я могу поделать?
Лучше скажите как преодолеть китайскую "no buf for action frame" ? Когда долго идет поток 3 мегабита в обе стороны в новой TCP2UART, то она вылазит и станция у ESP8266 отваливается.
Код:
....
uart_rx: new=1460, ns=2920, bl=2920
uart_rx: new=1460, ns=2920, bl=2920
|uart_rx: new=3812, ns=6732, bl=6732
|uart_rx#no buf for action frame
no buf for action frame
no buf for action frame
no buf for action frame
no buf for action frame
WiFi event(7): Probe Request (MAC:56:aa:c7:bd:65:5c, RSSI:-87)
no buf for action frame
no buf for action frame
no buf for action frame
...
Новую ещё не выкладывал из-за этой дурной причины. А без этого тянет 3 мегабита без разрывов в UART c отметками блоков (пауз в передаче по принципу modbus, но размер блока большой), если есть...
 
Сверху Снизу