浏览代码

update:增加了多串口使用示例

黄何 1 月之前
父节点
当前提交
c06ff458a8

+ 4 - 82
olddemo/modbus_rtu/main.lua

@@ -1,4 +1,4 @@
-PROJECT = "modbus_rtu"
+PROJECT = "modbus_rtu_uart2"
 VERSION = "001.000.000"
 
 sys = require("sys")
@@ -9,92 +9,14 @@ sys = require("sys")
 if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
     pm.power(pm.PWK_MODE, false)
 end
+require"uart1_rtu"
+require"uart2_rtu"
+require"uart11_rtu"
 
 -- 如果你用的是合宙DTU整机系列,才需要打开,否则按自己设计的PCB来
 -- gpio.setup(1, 1) -- 485转TTL芯片供电打开
 -- gpio.setup(24, 1) -- 外置供电电源打开
 
-modbus_rtu = require("modbus_rtu")
-
--- 初始化modbus_rtu
-modbus_rtu.init({
-    uartid = 1, -- 接收/发送数据的串口id
-    baudrate = 4800, -- 波特率
-    gpio_485 = 25, -- 转向GPIO编号
-    tx_delay = 50000 -- 转向延迟时间,单位us
-    -- 下面这些数据不填也行,不填底层默认为如下参数
-    -- databits = 8,--数据位
-    -- stopbits = 1,--停止位
-    -- parity = uart.None,--校验位
-    -- endianness = uart.LSB,--大小端
-    -- buffer_size = 1024,--缓冲区大小
-    -- rx_level = 0,--rx初始电平
-})
-
--- 定义modbus_rtu数据接收回调
-local function on_modbus_rtu_receive(frame)
-    log.info("modbus_rtu frame received:", json.encode(frame))
-    if frame.fun == 0x03 then -- 功能码0x03表示读取保持寄存器
-        local byte = frame.byte
-        local payload = frame.payload
-        -- log.info("modbus_rtu payload (hex):", payload:toHex())
-
-        -- 解析数据(假设数据为16位寄存器值)
-        local values_big = {} -- 大端序解析结果
-        for i = 1, #payload, 2 do
-            local msb = payload:byte(i)
-            local lsb = payload:byte(i + 1)
-
-            -- 大端序解析
-            local result_big = (msb * 256) + lsb
-            table.insert(values_big, result_big)
-        end
-
-        -- 输出大端序的解析结果
-        log.info("输出大端序的解析结果:", table.concat(values_big, ", "))
-
-        -- 第一个寄存器是湿度,第二个是温度,除以10以获取实际值
-        if #values_big == 2 then
-            log.info("测试同款485温湿度计")
-            local humidity = values_big[1] / 10
-            local temperature = values_big[2] / 10
-
-            -- 打印湿度和温度
-            log.info(string.format("湿度: %.1f%%", humidity))
-            log.info(string.format("温度: %.1f°C", temperature))
-
-            -- 发布湿度和温度
-            sys.publish("modbus_rtu_data", {humidity, temperature})
-        else
-            log.info("用户自己的485下位机,共有" .. #values_big .. "组数据")
-            for index, value in ipairs(values_big) do
-                log.info(string.format("寄存器 %d: %d (大端序)", index, value))
-            end
-
-        end
-    else
-        log.info("功能码不是03")
-    end
-end
-
--- 设置modbus_rtu数据接收回调
-modbus_rtu.set_receive_callback(1, on_modbus_rtu_receive)
-
-local function send_modbus_rtu_command()
-    local addr = 0x01 -- 设备地址,此处填客户自己的
-    local fun = 0x03 -- 功能码(03为读取保持寄存器),此处填客户自己的
-    local data = string.char(0x00, 0x00, 0x00, 0x02) -- 起始地址和寄存器数量(此处填客户自己的起始地址进而寄存器数量)
-
-    -- modbus_rtu.send_command(1, addr, fun, data) -- 只发送一次命令并等待响应处理
-    modbus_rtu.send_command(1, addr, fun, data, 5000) -- 循环5S发送一次
-
-end
-
-sys.taskInit(function()
-    sys.wait(5000)
-    send_modbus_rtu_command()
-
-end)
 
 -- local modbus_tcp = require("modbus_tcp")
 

+ 4 - 4
olddemo/modbus_rtu/modbus_rtu.lua

@@ -241,7 +241,7 @@ function modbus_rtu.send_command(uartid, addr, fun, data, interval)
     if interval then
         -- 如果传入了interval,则启用循环发送
         sys.timerLoopStart(function()
-            log.info("每隔" .. interval .. "秒发一次指令", cmd:toHex())
+            log.info("uart_"..uartid.."每隔" .. interval .. "秒发一次指令", cmd:toHex())
             uart.write(uartid, cmd)
         end, interval)
         -- sys.timerLoopStart(uart.write, interval, uartid, cmd)
@@ -260,12 +260,12 @@ function modbus_rtu.set_receive_callback(uartid, callback)
         repeat
             s = uart.read(id, len)
             if #s > 0 then
-                log.info("modbus_rtu 收到的下位机回复:", s:toHex())
+                log.info("modbus_rtu uart"..uartid.."收到的下位机回复:", s:toHex())
                 local frame, err = modbus_rtu.parse_frame(s)
                 if frame then
                     callback(frame)
                 else
-                    log.info("modbus_rtu 数据错误", err)
+                    log.info("modbus_rtu uart"..uartid.. "数据错误", err)
                 end
             end
         until s == ""
@@ -275,7 +275,7 @@ end
 -- 设置modbus_rtu数据发送回调
 function modbus_rtu.set_sent_callback(uartid, callback)
     uart.on(uartid, "sent", function(id)
-        log.info("modbus_rtu 数据发送:", id)
+        log.info("modbus_rtu uart"..uartid.. "数据发送:", id)
         if callback then
             callback(id)
         end

+ 81 - 0
olddemo/modbus_rtu/uart11_rtu.lua

@@ -0,0 +1,81 @@
+local  modbus_rtu = require("modbus_rtu")
+local uart_id = 11
+-- 初始化modbus_rtu
+modbus_rtu.init({
+    uartid = uart_id, -- 接收/发送数据的串口id
+    baudrate = 4800, -- 波特率
+    gpio_485 = 153, -- 转向GPIO编号
+    tx_delay = 50000 -- 转向延迟时间,单位us
+    -- 下面这些数据不填也行,不填底层默认为如下参数
+    -- databits = 8,--数据位
+    -- stopbits = 1,--停止位
+    -- parity = uart.None,--校验位
+    -- endianness = uart.LSB,--大小端
+    -- buffer_size = 1024,--缓冲区大小
+    -- rx_level = 0,--rx初始电平
+})
+
+-- 定义modbus_rtu数据接收回调
+local function on_modbus_rtu_receive(frame)
+    log.info("modbus_rtu frame received:", json.encode(frame))
+    if frame.fun == 0x03 then -- 功能码0x03表示读取保持寄存器
+        local byte = frame.byte
+        local payload = frame.payload
+        -- log.info("modbus_rtu payload (hex):", payload:toHex())
+
+        -- 解析数据(假设数据为16位寄存器值)
+        local values_big = {} -- 大端序解析结果
+        for i = 1, #payload, 2 do
+            local msb = payload:byte(i)
+            local lsb = payload:byte(i + 1)
+
+            -- 大端序解析
+            local result_big = (msb * 256) + lsb
+            table.insert(values_big, result_big)
+        end
+
+        -- 输出大端序的解析结果
+        log.info("输出大端序的解析结果:", table.concat(values_big, ", "))
+
+        -- 第一个寄存器是湿度,第二个是温度,除以10以获取实际值
+        if #values_big == 2 then
+            log.info("测试同款485温湿度计")
+            local humidity = values_big[1] / 10
+            local temperature = values_big[2] / 10
+
+            -- 打印湿度和温度
+            log.info(string.format("湿度: %.1f%%", humidity))
+            log.info(string.format("温度: %.1f°C", temperature))
+
+            -- 发布湿度和温度
+            sys.publish("modbus_rtu_data", {humidity, temperature})
+        else
+            log.info("用户自己的485下位机,共有" .. #values_big .. "组数据")
+            for index, value in ipairs(values_big) do
+                log.info(string.format("寄存器 %d: %d (大端序)", index, value))
+            end
+
+        end
+    else
+        log.info("功能码不是03")
+    end
+end
+
+-- 设置modbus_rtu数据接收回调
+modbus_rtu.set_receive_callback(uart_id, on_modbus_rtu_receive)
+
+local function send_modbus_rtu_command()
+    local addr = 0x01 -- 设备地址,此处填客户自己的
+    local fun = 0x03 -- 功能码(03为读取保持寄存器),此处填客户自己的
+    local data = string.char(0x00, 0x00, 0x00, 0x02) -- 起始地址和寄存器数量(此处填客户自己的起始地址进而寄存器数量)
+
+    -- modbus_rtu.send_command(uart_id, addr, fun, data) -- 只发送一次命令并等待响应处理
+    modbus_rtu.send_command(uart_id, addr, fun, data, 5000) -- 循环5S发送一次
+
+end
+
+sys.taskInit(function()
+    sys.wait(5000)
+    send_modbus_rtu_command()
+
+end)

+ 81 - 0
olddemo/modbus_rtu/uart1_rtu.lua

@@ -0,0 +1,81 @@
+local  modbus_rtu = require("modbus_rtu")
+local uart_id = 1
+-- 初始化modbus_rtu
+modbus_rtu.init({
+    uartid = uart_id, -- 接收/发送数据的串口id
+    baudrate = 4800, -- 波特率
+    gpio_485 = 29, -- 转向GPIO编号
+    tx_delay = 50000 -- 转向延迟时间,单位us
+    -- 下面这些数据不填也行,不填底层默认为如下参数
+    -- databits = 8,--数据位
+    -- stopbits = 1,--停止位
+    -- parity = uart.None,--校验位
+    -- endianness = uart.LSB,--大小端
+    -- buffer_size = 1024,--缓冲区大小
+    -- rx_level = 0,--rx初始电平
+})
+
+-- 定义modbus_rtu数据接收回调
+local function on_modbus_rtu_receive(frame)
+    log.info("modbus_rtu frame received:", json.encode(frame))
+    if frame.fun == 0x03 then -- 功能码0x03表示读取保持寄存器
+        local byte = frame.byte
+        local payload = frame.payload
+        -- log.info("modbus_rtu payload (hex):", payload:toHex())
+
+        -- 解析数据(假设数据为16位寄存器值)
+        local values_big = {} -- 大端序解析结果
+        for i = 1, #payload, 2 do
+            local msb = payload:byte(i)
+            local lsb = payload:byte(i + 1)
+
+            -- 大端序解析
+            local result_big = (msb * 256) + lsb
+            table.insert(values_big, result_big)
+        end
+
+        -- 输出大端序的解析结果
+        log.info("输出大端序的解析结果:", table.concat(values_big, ", "))
+
+        -- 第一个寄存器是湿度,第二个是温度,除以10以获取实际值
+        if #values_big == 2 then
+            log.info("测试同款485温湿度计")
+            local humidity = values_big[1] / 10
+            local temperature = values_big[2] / 10
+
+            -- 打印湿度和温度
+            log.info(string.format("湿度: %.1f%%", humidity))
+            log.info(string.format("温度: %.1f°C", temperature))
+
+            -- 发布湿度和温度
+            sys.publish("modbus_rtu_data", {humidity, temperature})
+        else
+            log.info("用户自己的485下位机,共有" .. #values_big .. "组数据")
+            for index, value in ipairs(values_big) do
+                log.info(string.format("寄存器 %d: %d (大端序)", index, value))
+            end
+
+        end
+    else
+        log.info("功能码不是03")
+    end
+end
+
+-- 设置modbus_rtu数据接收回调
+modbus_rtu.set_receive_callback(uart_id, on_modbus_rtu_receive)
+
+local function send_modbus_rtu_command()
+    local addr = 0x01 -- 设备地址,此处填客户自己的
+    local fun = 0x03 -- 功能码(03为读取保持寄存器),此处填客户自己的
+    local data = string.char(0x00, 0x00, 0x00, 0x02) -- 起始地址和寄存器数量(此处填客户自己的起始地址进而寄存器数量)
+
+    -- modbus_rtu.send_command(uart_id, addr, fun, data) -- 只发送一次命令并等待响应处理
+    modbus_rtu.send_command(uart_id, addr, fun, data, 5000) -- 循环5S发送一次
+
+end
+
+sys.taskInit(function()
+    sys.wait(5000)
+    send_modbus_rtu_command()
+
+end)

+ 81 - 0
olddemo/modbus_rtu/uart2_rtu.lua

@@ -0,0 +1,81 @@
+local  modbus_rtu = require("modbus_rtu")
+local uart_id = 2
+-- 初始化modbus_rtu
+modbus_rtu.init({
+    uartid = uart_id, -- 接收/发送数据的串口id
+    baudrate = 4800, -- 波特率
+    gpio_485 = 30, -- 转向GPIO编号
+    tx_delay = 50000 -- 转向延迟时间,单位us
+    -- 下面这些数据不填也行,不填底层默认为如下参数
+    -- databits = 8,--数据位
+    -- stopbits = 1,--停止位
+    -- parity = uart.None,--校验位
+    -- endianness = uart.LSB,--大小端
+    -- buffer_size = 1024,--缓冲区大小
+    -- rx_level = 0,--rx初始电平
+})
+
+-- 定义modbus_rtu数据接收回调
+local function on_modbus_rtu_receive(frame)
+    log.info("modbus_rtu frame received:", json.encode(frame))
+    if frame.fun == 0x03 then -- 功能码0x03表示读取保持寄存器
+        local byte = frame.byte
+        local payload = frame.payload
+        -- log.info("modbus_rtu payload (hex):", payload:toHex())
+
+        -- 解析数据(假设数据为16位寄存器值)
+        local values_big = {} -- 大端序解析结果
+        for i = 1, #payload, 2 do
+            local msb = payload:byte(i)
+            local lsb = payload:byte(i + 1)
+
+            -- 大端序解析
+            local result_big = (msb * 256) + lsb
+            table.insert(values_big, result_big)
+        end
+
+        -- 输出大端序的解析结果
+        log.info("输出大端序的解析结果:", table.concat(values_big, ", "))
+
+        -- 第一个寄存器是湿度,第二个是温度,除以10以获取实际值
+        if #values_big == 2 then
+            log.info("测试同款485温湿度计")
+            local humidity = values_big[1] / 10
+            local temperature = values_big[2] / 10
+
+            -- 打印湿度和温度
+            log.info(string.format("湿度: %.1f%%", humidity))
+            log.info(string.format("温度: %.1f°C", temperature))
+
+            -- 发布湿度和温度
+            sys.publish("modbus_rtu_data", {humidity, temperature})
+        else
+            log.info("用户自己的485下位机,共有" .. #values_big .. "组数据")
+            for index, value in ipairs(values_big) do
+                log.info(string.format("寄存器 %d: %d (大端序)", index, value))
+            end
+
+        end
+    else
+        log.info("功能码不是03")
+    end
+end
+
+-- 设置modbus_rtu数据接收回调
+modbus_rtu.set_receive_callback(uart_id, on_modbus_rtu_receive)
+
+local function send_modbus_rtu_command()
+    local addr = 0x01 -- 设备地址,此处填客户自己的
+    local fun = 0x03 -- 功能码(03为读取保持寄存器),此处填客户自己的
+    local data = string.char(0x00, 0x00, 0x00, 0x02) -- 起始地址和寄存器数量(此处填客户自己的起始地址进而寄存器数量)
+
+    -- modbus_rtu.send_command(uart_id, addr, fun, data) -- 只发送一次命令并等待响应处理
+    modbus_rtu.send_command(uart_id, addr, fun, data, 5000) -- 循环5S发送一次
+
+end
+
+sys.taskInit(function()
+    sys.wait(5000)
+    send_modbus_rtu_command()
+
+end)