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

Нужна помощь 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.
 
Сверху Снизу