• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Sming Open Source Framework для нативной разработки прошивок ESP8266

manfredmann,
Код:
void init()
{
Serial.begin(SERIAL_BAUD_RATE); // 115200 by default
Serial.systemDebugOutput(false);
Serial.commandProcessing(false);
}
вторая строка кода то, что отрубает отладочную инфу с консоли
 

Spark

New member
Всем привет!

Возникла задача сделать "прозрачный" (или с легкой командной оберткой) мост TCP<->Serial. Передача из TCP в Serial, получается из колбака onReceive хоть даже так: Serial.print( String( data,size ) ); Как передавать в обратную сторону ни как не пойму. Вызов функций write и подобных для TcpServer (или TcpConnection) в лучшем случае приводит к подвисанию до тех пор пока не придут данные по TCP.
Расскажите о работе Network-классов, без комментариев оказалось достаточно сложно разобраться.
 

pvvx

Активный участник сообщества
Возникла задача сделать "прозрачный" (или с легкой командной оберткой) мост TCP<->Serial. Передача из TCP в Serial, получается из колбака onReceive хоть даже так: Serial.print( String( data,size ) );
Каким образом это пройдет, если данные с UART передаются на низкой скорости и буфер передачи уже полон, а пришел новый пакет (onReceive)?
Пример: приходит TCP или UDP пакет в 1460 байт. Чтобы его вылить на 9600 baud (до 900 символов в секунду при 11 битах на символ) требуется 1560/900=1.7 секунды.
Трансфер TCP у модуля по WiFi составляет 1 Мегабайт в секунду :)
Все эти проблемы (и другие, про прием) давно решены в Прошивка TCP2UART переходника с настройкой по Web в соответствии со стандартами TCP. На Ардуино это практически невозможно, т.к. нет доступа к низкому уровню работы с LwIP и прерываниям UART.
 
Последнее редактирование:

Spark

New member
Естественно такой "транзит" будет работать при одинаковых средних скоростях передачи по uplink и downlink. И как раз проблемы с отправкой байтов из onReceive нет, все успевает. Переполнение буфера UART это отдельная ситуация, я пока до этого еще не дошел. Мне сейчас бы данные запустить в обе стороны.
 

pvvx

Активный участник сообщества
Естественно такой "транзит" будет работать при одинаковых средних скоростях передачи по uplink и downlink. И как раз проблемы с отправкой байтов из onReceive нет, все успевает. Переполнение буфера UART это отдельная ситуация, я пока до этого еще не дошел. Мне сейчас бы данные запустить в обе стороны.
Каким образом в асинхронной сети Инет вы обеспечите "одинаковых средних скоростях передачи по uplink и downlink"? Только путем ввода таймаутов передачи в десятки раз превышающих пинг по сети инет? Это не менее 5 сек для GSM, а по общим стандартам за 60 сек :)
Другой вариант передача-ответ. Но это уже что-то специфическое и не является годным для всего.
Третий вариант - а пофиг всё = Дурино.
При приеме надо уменьшать "окно TCP", которое указывает отправителю, что больше чем в нем отправить уже нельзя. Это всё работает само по стандарту TCP, но вам надо иметь доступ к этим параметрам в LwIP.
При передаче аналогично - куда передавать, если принимающий не может принять?
В итоге синхронизация по максимальной скорости произойдет автоматически...
 
Последнее редактирование:

Spark

New member
Проблема с переполнением буфера понятна, у меня входящий трафик меньше чем исходящий. Да и нет у меня ардуины и пусть будет "передача-ответ", мне на надо универсального решения. Вопрос же в том как отправлять данные? Я смотрел несколько программ типа этой
, и писал сам подобное на фреймфорке с FreeRTOS, хочу повторить на Sming'e.
 

pvvx

Активный участник сообщества
и писал сам подобное на фреймфорке с FreeRTOS, хочу повторить на Sming'e.
Для это слишком много требуется не стандартно включенного в sming, т.е. вам придется бороться со sming, что проще написать без него. К примеру прилепить полностью свою либу к arduino управляющую UART и LwIP по прерываниям.
В итоге получите практически аналог имеющегося TCP2UART, но для настройки параметров WiFi и UART будет использоваться sming или хоть Lua, Basic, Java уже перенесенные на ESP8266...
 
Последнее редактирование:

Spark

New member
Хорошо, забудем про мост :) Я хочу понять как в Sming организовать отправку байтов через TCPServer?
 

pvvx

Активный участник сообщества
Хорошо, забудем про мост :) Я хочу понять как в Sming организовать отправку байтов через TCPServer?
Смотрите сколько может передать LwIP в текущий момент по snd_buf и передаете :)
Для приема/передачи бинарных данных от UART есть альтернативный вариант с использованием WebSocket и спец. протоколом в нем. Поддержка WebSocket уже существует во многих браузерах... Полноценной реализации WebSocket на ESP8266 пока нет, но она не сложна.
 
Последнее редактирование:

Spark

New member
Спасибо, становится понятнее. Хотя работает же там все штатным образом. NoDelay использовал, но snd_buf не смотрел. Про websocket думал, попробую его погонять.
 

pvvx

Активный участник сообщества
Про websocket думал, попробую его погонять.
В websocket стандартом предусмотрены асинхронные (потоку данных) сообщения о занятости и прочих состояниях. Это поможет справиться с задачей UART переполнения буферов и прочими... Но c ASCII там беда - только расширенные форматы типа юникод и UTF8, что не поддерживается никакими либами работающими со строками в ESP8266.
 
Последнее редактирование:

Spark

New member
Это в любом случае выход, можно использовать аппаратные сигналы квитирования UART, или XON/XOFF.
 

pvvx

Активный участник сообщества
Это в любом случае выход, можно использовать аппаратные сигналы квитирования UART, или XON/XOFF.
Но я так и не доделал websocket, т.к. опять требуется специфичность, зависящая от задачи. Стандартной надстройки для UART в websocket пока нет.
 

Casper

Member
Подскажите пожалуйста, где можно посмотреть пример, когда на страничке обновляются данные через определённый периуд. К примеру когда подключился к esp, можно было смотреть какая сейчас температура.
 

pvvx

Активный участник сообщества
Да, можно, но лучше предварительно проверить область инициализации spiffs.
А как узнать какой размер данных в файле можно сохранить в spiffs? ;)
Пример: Хочу принять по TCP и записать 64 кило файл. Как узнать влезет он в spiffs или нет?
 

manfredmann

New member
Неплохо было бы добавить поддержку 64mbit флеш :)

Хм. Работа с флешками большего объёма, чем "стандартная" довольно не стабильна. После нескольких скачиваний файла в spiffs (точно сейчас не скажу, около 10 раз, файл 230кб, перед тем, как качать новый, старый удалялся) модуль перезагружается, и последующие попытки скачать хоть что-нибудь, приводят к перезагрузке модуля. Помогает только перепрошивка, видимо фс где-то бъётся.
SPI_SIZE = 32m флешка впаяна на 64мбита, но по идее это не важно, главное, что не меньше 32.
 
Последнее редактирование:

codavr

New member
прошу помощи.
установил сабж автоматическим установщиком. винда 7я
при попытке выполнить project/build project вылезает такая ошибка:

тут http://www.esp8266.com/viewtopic.php?p=25571 у чела та же проблема, но как он её решил - не сказано.

PS: разобрался. mingw не может найти свои пути в конце длинной PATH. перенёс в начало - всё собралось!
отличный рудимент в семёрке этот PATH.
 

Вложения

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

codavr

New member
продолжаю попытки заставить это работать...
проекты начали собираться, но после прошивки любого проекта в ESP-12E в уарт выдаётся:
ets Jan 8 2013,rst cause:1, boot mode:(3,5)

load 0x40100000, len 21700, room 16
tail 4
chksum 0xef
load 0x3ffe8000, len 856, room 4
tail 4
chksum 0x88
load 0x3ffe8358, len 1144, room 4
tail 4
chksum 0x0f
csum 0x0f
rlfs.start: size:272 Kb, offset:40238000

First init file system
sect_first: 38, sect_last: 7c


ets Jan 8 2013,rst cause:1, boot mode:(3,5)

load 0x40100000, len 21700, room 16
tail 4
chksum 0xef
load 0x3ffe8000, len 856, room 4
tail 4
chksum 0x88
load 0x3ffe8358, len 1144, room 4
tail 4
chksum 0x0f
csum 0x0f
rlfs.start: size:272 Kb, offset:40238000

First init file system
sect_first: 38, sect_last: 7c

с периодичностью секунд в 5.

до void init() как я понял, дело даже не доходит.

ресетится где-то в недрах spiffs_mount();
 
Последнее редактирование:

codavr

New member
codavr, по каким адресам прошиваете? Посмотрите внимательно на этот момент :)
прошивал из эклипса туда, куда указывал makefile. похоже вачдог срабатывал. укоротил чистку секторов до 0х58 - вроде заработало.
Щас другая проблема (возможно она вытекла из предыдущей) загрузил на фтп несколько файлов из папки HttpServer_ConfigNetwork\web\dev с помощью файлзиллы.
все загрузить почему-то не получилось. щас не могу их удалить. никак. на команду DELE север отвечает OK, но после обновления списка файлов изменений нет.
также файловая система более не форматируется при заливке новой прошивки.

Есть какое-нибудь удобное средство просмотра/редактирования флеш-памяти?
проект какой-нибудь? через браузер, либо через компорт?
вижу, что spiffs_format_internal вызывается только, если считано ffff....
могу конечно принудительно его вызвать.. (оказывается можно проще: команда FSFORMAT серверу творит чудеса...)

в эклипсе при сборке видны такие адреса:
eagle.flash.bin-------->0x00000
eagle.irom0text.bin---->0x9000
spiff_rom.bin---------->0x44000


поставил в user_init так:
WDT.enable(false);
spiffs_mount();
WDT.enable(true);
чистка секторов в spiffs_format_internal стала добираться до 0x6a (по вачдогу было 0x60) и дальше снова ресет...
 
Последнее редактирование:
Сверху Снизу