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

Решено Прием данных через UART и отправка на TCP-сервер

zakharovjs

New member
Здравствуйте, можете подсказать пример кодов для обработки 2 байтов с последующей передачей на TCP сервер. 2 байта идут с PIC16F628a длительность имп. 104 мкс рассчитана 9600 бод. (То есть 1(старт.бит)+8(старш.биты)+1(стоп.бит)+1(старт.бит)+8(млад.биты)+1(стоп.бит)). Принятые данные умножаются на число х и передаются на TCP-сервер. Спасибо за помощь!
 
Последнее редактирование:

NeoroN

Member
Если там 9600 то можно читать функцией по работе с последовательным портом.
вот пример nodemcu/nodemcu-firmware
но можно и клиентом отправлять каждый пакет данных - создавая отдельное подключение:
Код:
uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
uart.on("data",2, function(data)
    --Подготовка данных 2 байта в число и умножаем на число
    local ret = (string.byte(data,0)*256+string.byte(data,1))*100
    local client = net.createConnection(net.TCP, 0)
    client:on("connection", function(sck, c) sck:send(string.format("value=%d\n",ret)) end)
    client:on("sent", function(sck) sck:close() end)
    client:connect(5000,"192.168.0.203")
end, 0)
 
Последнее редактирование:

zakharovjs

New member
Если там 9600 то можно читать функцией по работе с последовательным портом.
вот пример nodemcu/nodemcu-firmware
но можно и клиентом отправлять каждый пакет данных - создавая отдельное подключение:
Код:
uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
uart.on("data",2, function(data)
    --Подготовка данных 2 байта в число и умножаем на число
    local ret = (string.byte(data,0)*256+string.byte(data,1))*100
    local client = net.createConnection(net.TCP, 0)
    client:on("connection", function(sck, c) sck:send(string.format("value=%d\n",ret)) end)
    client:on("sent", function(sck) sck:close() end)
    client:connect(5000,"192.168.0.203")
end, 0)
Спасибо за отзыв. То есть в данном коде esp8266 работает как TCP-клиент и отправляет данные уже готовому серверу да? А можно ли поднять сначала TCP-сервер и затем послать данные.
 

NeoroN

Member
Если нельзя, но очень хочется - то можно:
Код:
uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
sv=net.createServer(net.TCP, 60)
global_c = nil
sv:listen(5000, function(c)
    if global_c~=nil then
        global_c:close()
    end
    global_c=c
    c:on("receive",function(sck,pl)    uart.write(0,pl) end)
end)

uart.on("data",2, function(data)
    if global_c~=nil then
        --Подготовка данных 2 байта в число и умножаем на число
        local ret = (string.byte(data,0)*256+string.byte(data,1))*100
        global_c:send(string.format("value=%d\n",ret))
    end
end, 0)
 

zakharovjs

New member
Код:
wifi.setmode(wifi.STATIONAP)
wifi.ap.config({ssid="WiFi", pwd="1234567890"})
uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
sv=net.createServer(net.TCP, 60)
global_c = nil
sv:listen(5000, function(c)
    if global_c~=nil then
        global_c:close()
    end
    global_c=c
    c:on("receive",function(sck,pl)    uart.write(0,pl) end)
end)

uart.on("data",2, function(data)
    if global_c~=nil then
        --Подготовка данных 2 байта в число и умножаем на число
        local ret = (string.byte(data,0)*256+string.byte(data,1))*750
        global_c:send(string.format("value=%d\n",ret))
    end
end, 0)
Также нужно режим точки доступа включить и настроить. Вопрос: подготовка данных и передача в данном коде будет осуществляться периодически? Потому как с пика каждые несколько миллисекунд приходят 2 байта и они должны передаваться на сервер, а клиентская часть в свою очередь обрабатывать эти данные(дальность).
 

NeoroN

Member
В теории все должно работать, но вай фай плохо приспособлен к минимальным задержкам.
Может даже стоит использовать UDP вместо TCP - надо эксперементировать.

Код вызывает функцию на каждые 2 байта принятые в UART. Если к ESP8266 подключится клиент - данные будут обрабатываться и при "0a bc" (10*256+188)*100=274800 отправит в сокет "value=274800\n"
 
Последнее редактирование:

=AK=

New member
у отладочной платы Nodemcu есть два UART порта можно ли на второй настроить прием данных т.к первая используется непосредственно для программирования модуля.
Второй UART не настоящий. Но вам никто не мешает использовать первый UART и для программирования, и для обмена. Ведь вам же не надо то и другое делать одновременно.
 
Сверху Снизу