Нужна помощь MQTT+UART

ESP должен получать через UART0 пакеты данных (40 байт), сохранять их в некотором массиве, и посылать по MQTT протоколу на сервер. И наоборот, получать по MQTT команды и отсылать их в UART0. На основе c:\Espressif\examples\ESP8266\blinky2\ и доработанного модуля uart.c я написал часть, которая работает с моим устройством. Принимает пакеты, заполняет массив данными, выдает на терминал (UART1) содержимое массива. Пример MQTT c:\Espressif\examples\ESP8266\esp_mqtt\ отдельно тоже работает. Когда я собираю все вместе, программа в ESP падает (illegal instruction) в самом начале. Когда я убрал и из своей программы и из esp_mqtt весь код, связанный с выводом в терминал (у меня он был довольно сложный, выводил такого вида строки с отображением float):

0 ; 0x00ad:A; 45 'C:N; 0x09:N Normal ; 3.007A :N; 85.76V :N; 268.9W :N; 45.65kWh :A; 7:d 2:h 4:m 41:s :A; 0x00000000:A; 77 %:A;

Код, кажется, заработал, но все равно иногда падает. Ощущение такое, что результирующий код просто куда-то не влазит, но я не знаю как к этому подступиться. Использую Unofficial Development Kit for Espressif ESP8266 v2.2.2 (23.04.2017) (с другими картина та же). В проектах с использованием Sming при сборке программы печатается табличка, но я так и не нашел как добавить в makefile код для этого.

Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE838A| 906
rodata| ReadOnly Data (RAM)| 3FFE8390| 3FFE9714| 4996
bss| Uninitialized Data (RAM)| 3FFE9718| 3FFF0218| 27392
text| Cached Code (IRAM)| 40100000| 4010757E| 30078
irom0_text| Uncached Code (SPI)| 40209000| 4023E2EE| 217838
Total Used RAM : 33294
Free RAM : 48626
Free IRam : 2708


В проекте uart.zip - работающий код, принимающий пакеты в UART0 и печатающий их содержимое в UART1. В проекте mqtt.zip - попытка соединить вместе пример и этот код.


Вопросы следующие:
1. В чем может быть проблема
2. Что делать
3. Есть ли возможность включить оптимизацию компилятору, если проблема в размере?
4. Что и куда добавить в makefile для вывода таблички о памяти.
 

Вложения

shuraf

Member
Счас придет pvvx и объяснит куда выкинуть 'эту глючную поделку'© )))
 

cheblin

Member
Да я уже и сам на полпути к этому.

PS Кстати, а на что, какие альтернативы есть?
Привет,

если наличие MQTT не критично, то попробуйте перейти на BlackBox он сгенерирует для Вас полный стек исходников обработки пакетов. И на микроконтроллер и на сервер. Код будет оптимизированный и очень компактный, ничего лишнего.
 
Привет,

если наличие MQTT не критично, то попробуйте перейти на BlackBox он сгенерирует для Вас полный стек исходников обработки пакетов. И на микроконтроллер и на сервер. Код будет оптимизированный и очень компактный, ничего лишнего.
MQTT - критично. Обработка пакетов не вызывает никаких затруднений (я же их и формирую с другой стороны), проблема в том, что код, стабильно работающий отдельно (и на других платформах) падает вместе с тоже работающим MQTT, ради которого и используется ESP.
 
Взял за основу исходники c:\Espressif\ESP8266_NONOS_SDK-2.1.0\examples\esp_mqtt_proj\ и вдруг все стабильно заработало, видимо что-то в SDK2.1.0 исправили, или в самих исходниках, не знаю, заменил все... И даже нашел как распределение памяти печатать :) Осталось найти как сделать настройку SSID/PWD через WiFiManager, но без Arduino (ну не могу я на него смотреть).
 

Вложения

И еще вопрос по MQTT, почему-то

вот это, с перекодировкой данных в base64 работает,
Код:
    sz = dat2b64(str, (char*)&nodes[ii].node, sizeof(tnode)+1); //nodes[ii].node + nodes[ii].timer
    MQTT_Publish(&mqttClient, "wotqbxcv2G/dima/0", str, sz, 0, 0); //Browser subscribe "wotqbxcv2G/#"
    os_printf("%d  %s %d \n\r", ii, str, *(char*)(&nodes[ii].node+1));
а просто посылка этих данных as is, сырых - вроде как ничего не посылает.

Код:
  MQTT_Publish(&mqttClient, "wotqbxcv2G/dima/1", (char*)&nodes[ii].node, sizeof(tnode)+1, 0, 0);
 
И еще вопрос по MQTT, почему-то

вот это, с перекодировкой данных в base64 работает,
Код:
    sz = dat2b64(str, (char*)&nodes[ii].node, sizeof(tnode)+1); //nodes[ii].node + nodes[ii].timer
    MQTT_Publish(&mqttClient, "wotqbxcv2G/dima/0", str, sz, 0, 0); //Browser subscribe "wotqbxcv2G/#"
    os_printf("%d  %s %d \n\r", ii, str, *(char*)(&nodes[ii].node+1));
а просто посылка этих данных as is, сырых - вроде как ничего не посылает.

Код:
  MQTT_Publish(&mqttClient, "wotqbxcv2G/dima/1", (char*)&nodes[ii].node, sizeof(tnode)+1, 0, 0);
Привет друг! Подскажи как mqtt пользоваться? К примеру надо управлять светодиодом, пишу led1_on в исходнике. Но вот где и как это прописать? И ещё вопрос : этот пример вебинтерфейс имеет?
 
Привет друг! Подскажи как mqtt пользоваться? К примеру надо управлять светодиодом, пишу led1_on в исходнике. Но вот где и как это прописать? И ещё вопрос : этот пример вебинтерфейс имеет?
Этот - нет, есть и с веб-интерфейсом для сетапа. Чтобы пользоваться mqtt нужно довольно много. Нужен mqtt сервер (его зовут broker), нужен второй клиент - собственно пользовательский софт. esp (много esp) подключается к брокеру (он может быть локальным, в той же сети), или стоять где-то на каком-то сервере в интернете. Клиентская программа тоже подключается к брокеру и посылает сообщения через него в esp. Все это довольно сложное и громоздкое (ну если с реализацией в крохотной esp сравнивать, особенно если используется ssl шифрование), но удобство в том, что можно откуда угодно по имени устройства к нему обращаться, никакие ip адреса и роутинг пакетов от клиентской программы к устройству на esp волновать не должен. Максимум, если брокер локальный, нужно обеспечить только его видимость в интернете. Чтобы просто мигать LED'ом это все избыточно...
 
вопрос к Вам:
В пакете UART в проге user_main.c
есть "замечательная" функция:
void ICACHE_FLASH_ATTR sprint(void)
{
tbuf buf;
os_printf(...
...
}
В которую ничего не передаете и печатаете содержимое локальной структуры , которая очевидно пустая.
----------------
Не смог понять зачем это. Поясните плиз.
Спасибо

Не понял в каком примере и где есть такая функция.
 
В самом начале темы Вы выложили UART.ZIP
там в каталоге USER есть файл user_main.c
и там эта функция.

void ICACHE_FLASH_ATTR sprint(void)
{
tbuf buf;
os_printf("tbuf=%d\n\r", sizeof(tbuf));
}

Вы сами смотрели то, что выложили?
А, теперь понял о чем вы. Просто смотрел как реально выглядит эта структура с учетом атрибутов выравнивания, потому что передается она, и надо чтобы на разных процессорах и компиляторах она совпадала. Год же прошел, я уже забыл все. Сейчас этот код давно готовый, работает, даже с ssl.
 
Сверху Снизу