--- modbus模块功能 -- @module modbus -- @author Dozingfiretruck -- @license MIT -- @copyright openLuat -- @release 2020.12.17 module(...,package.seeall) require"utils" require"common" --保持系统处于唤醒状态,此处只是为了测试需要,所以此模块没有地方调用pm.sleep("testUart")休眠,不会进入低功耗休眠状态 --在开发“要求功耗低”的项目时,一定要想办法保证pm.wake("modbusrtu")后,在不需要串口时调用pm.sleep("testUart") pm.wake("modbusrtu") local uart_id = 1 local uart_baud = 9600 --[[ -- 起始 地址 功能代码 数据 CRC校验 结束 -- 3.5 字符 8 位 8 位 N x 8 位 16 位 3.5 字符 --- 发送modbus数据函数 @function modbus_send @param slaveaddr : 从站地址 Instructions:功能码 reg : 寄存器编号 value : 写入寄存器值或读取寄存器个数,2字节 @return 无 @usage modbus_send("0x01","0x01","0x0101","0x04") ]] local function modbus_send(slaveaddr,Instructions,reg,value) local data = (string.format("%02x",slaveaddr)..string.format("%02x",Instructions)..string.format("%04x",reg)..string.format("%04x",value)):fromHex() local modbus_crc_data= pack.pack('0 then local a,_ = string.toHex(cacheData) log.info("modbus接收数据:",a) --用户逻辑处理代码 -- cacheData = "" end end else cacheData = cacheData..s end end end --注册串口的数据发送通知函数 uart.on(uart_id,"receive",function() sys.publish("UART_RECEIVE") end) --配置并且打开串口 uart.setup(uart_id,uart_baud,8,uart.PAR_NONE,uart.STOP_1) --启动串口数据接收任务 sys.taskInit(modbus_read) sys.taskInit(function () while true do sys.wait(5000) modbus_send("0x01","0x01","0x0101","0x04") end end)