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

Modbus TCP / RTU RS-485 + WEB server

alikxus

New member
С "parity" поиграйтесь. Может не соответствует установкам с другой стороны модуля.
заработало, проблема была в - при больших скоростях, может потребовать дополнительной подтяжки к +3.3В - как то не обратил на это особого внимания, скорость выставил 9600, а оказалось тоже не хватает. Спасибо за помощь. Осталось понять как этот буфер сохранять при отключения питания в самом nodemcu.
 

DorianGray

New member
Добрый день. Возникло несколько сложностей. Пытаюсь добавить подключение к серверу с помощью TCP/IP, но что-то не очень получается. Вот у вас есть возможность через WEB-морду настроить подключение к серверу, задав IP сервера. Разобрался где в коде происходит прием данных - насколько я понял это функция tcpsrv_received_data_default(TCP_SERV_CONN *ts_conn).
Поискав, я нашел функцию tcpsrv_int_sent_data, с помощью которой отправляю данные на сервер.
Но непонятно что значит "вызывать только из call back с текущим pcb!" в описании функции tcpsrv_int_sent_data.
В общем мне необходимо настроить передачу параметров на сервер, но как добавить новый сокет я немогу понять никак.
Плиз, дайте пинок в нужном направлении.
 

pvvx

Активный участник сообщества
Но непонятно что значит "вызывать только из call back с текущим pcb!" в описании функции tcpsrv_int_sent_data.
Соединение уже может быть закрыто, по этому и написано. Надо проверять активность pcb перед выводом и что она принадлежит тому соединению. Индекс pcb - это указатель в памяти heap на блок pcb. Он быть уже освобожден LwIP и занят другой pcb. Обработка ввода идет по прерываниям - асинхронно к другим процессам...
В общем мне необходимо настроить передачу параметров на сервер, но как добавить новый сокет я немогу понять никак.
Плиз, дайте пинок в нужном направлении.
По аналогии с тем не сделать, т.к. он специфический. Для этого есть пример - esp8266web/ovls/tcp_client:
Пример TCP клиента.
Считывает температуру воздуха из HTML по адресу weather-in.ru - погода в Санкт-Петербург (север) (г. Санкт-Петербург, Пушкинский район) - прогноз погоды в России на 3 и 5 дней
 

DorianGray

New member
Окей, в плане сокетов понял куда копать, спасибо большое за напутствие.
Пока данные передаю с помощью сокета ModbusTcpClient-а. Но возникла какая-то непонятная проблема - при формировании пакета для передачи (простенькой JSON посылки), с помощью функций os_memcpy получается следующая непонятка, пакет в буфере собирается нормально и отправляется на сервер, на сервере все принимается корректно. Но возникает проблема в расчете CRC для транзактора - не погу понять почему так происходит. При размере JSON пакета больше 170 байт, CRC перестает правильно рассчитываться :(
UPD 1:
Ощущение что чего-то не хватает , то ли стека, то ли RAM то-ли flash =(
UPD 2:
Решил проблему, тем что переместил таблицу для расчета CRC из flash в RAM. Получается, не хватает памяти для пользовательской прошивки и данные немного перетираются другим сегментом - буду смотреть линковку и сегментацию адрресного пространства.
 
Последнее редактирование:

Urbas81

Member
Добрый день! Подскажите реально ли прикрутить к этому проекту протокол mqtt, в examples есть рабочий esp_mqtt, но с переносом всех библиотек в проект возникает куча ошибок, хватит ли ресурсов, может и не стоит пытаться, а если ресурсов хватит, подскажите как это сделать, структура проекта отличается от тех что в примерах и вообще возможно ли это?
 

pvvx

Активный участник сообщества
Добрый день! Подскажите реально ли прикрутить к этому проекту протокол mqtt, в examples есть рабочий esp_mqtt, но с переносом всех библиотек в проект возникает куча ошибок, хватит ли ресурсов, может и не стоит пытаться, а если ресурсов хватит, подскажите как это сделать, структура проекта отличается от тех что в примерах и вообще возможно ли это?
Нет - я против mqtt, но сделать можно всё. :)
 

Urbas81

Member
Руками. Берете исходники, стыкуете и собираете :)
Можно и без этого - прописываете скрипт на роутере на стыковку Websocket <-> mqtt.
Ну я так и начал, но так как в Вашем проекте используется не весь функционал SDK и стек другой то появились сразу проблемы.
 

pvvx

Активный участник сообщества
Ну я так и начал, но так как в Вашем проекте используется не весь функционал SDK и стек другой то появились сразу проблемы.
Стек у ESP8266 у всех один = LwIP.
Китайскую нашлепку espconn не использую - она от версии к версии SDK с разными багами...
 

Urbas81

Member
А такой еще вопрос, хочу попробовать присоединить 7 сегментный индикатор на MAX7219, обмен по SPI, есть работающие варианты из других проектов, хотел попробовать втиснуть сюда, хотел узнать в каком файле лучше добавить код, так чисто для проверки без создания своих файлов?
 

Urbas81

Member
имхо в оверлей.
скомпилил загрузил, проверил, не понравилось п1. (без перепрошивки)
Подключил библиотеку, в первом приближении работает, попробую библиотеку дрделать, а то она под матрицу была, а у меня индикатор. С оерлеями пока не сильно понял как работать, да и что то у меня не прописано, выскакивают ошибки при сборке.
 

Urbas81

Member
а скромно так лог ошибок спросить можно?
и как обошли? что оверлеи не компилятся.
Ну прошивка то собиратся, а пишет вот что:
c:/Espressif/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc -Os -Wall -Wno-pointer-sign -fno-tree-ccp -mno-target-align -mno-serialize-volatile -foptimize-register-move -Wundef -Wpointer-arith -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -DICACHE_FLASH -DPBUF_RSV_FOR_WLAN -DLWIP_OPEN_SRC -DEBUF_LWIP -I ./include -I ../include -I ../../include -I C:/Espressif_new/Work/esp8266web-0.6.2/include -I C:/Espressif_new/Work/esp8266web-0.6.2/app/include -o .output/eagle/obj/main.o -c main.c
main.c: In function 'drv_recv':
main.c:72:7: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
drv_host_ip = *addr;
^
main.c:74:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
udpbuflen = ets_sprintf(pudpbuf, DRV_ip_str, IP2STR(&drv_host_ip), port);
^
main.c:74:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
main.c:74:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
main.c:74:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
main.c: In function 'test_timer_isr':
main.c:156:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
drv_press = sblk_data->press = bmp280_compensate_P_int32(&bmp280);
^
main.c:162:9: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
if(err == ERR_OK) udp_sendto(pcb_udp_drv, z, &drv_host_ip, drv_host_port);
^
main.c: In function 'init_udp_drv':
main.c:187:2: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
if(drv_host_port == 0 || drv_host_ip.addr == 0) {
^
main.c:189:3: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
drv_host_ip.addr = 0xFFFFFFFF;
^
cc1.exe: all warnings being treated as errors
make[4]: *** [.output/eagle/obj/main.o] Error 1
make[4]: Leaving directory `/c/Espressif_new/Work/esp8266web-0.6.2/ovls/10dof/main'
make[3]: *** [.subdirs] Error 2
make[3]: Leaving directory `/c/Espressif_new/Work/esp8266web-0.6.2/ovls/10dof'
make[2]: *** [.subdirs] Error 2
make[2]: Leaving directory `/c/Espressif_new/Work/esp8266web-0.6.2/ovls'
mingw32-make[1]: *** [.output/eagle/bin/eagle.app.v6.bin] Error 2
../Makefile:225: recipe for target '.output/eagle/bin/eagle.app.v6.bin' failed
mingw32-make.exe: *** [.subdirs] Error 2
mingw32-make[1]: Leaving directory 'C:/Espressif_new/Work/esp8266web-0.6.2/app'
C:/Espressif_new/Work/esp8266web-0.6.2/Makefile:282: recipe for target '.subdirs' failed

19:41:57 Build Finished (took 6s.422ms)
 
Сверху Снизу