| 
 电路说明
 模块有三个串口:   日志打印口: HOST_TXD;HOST_RXD AT/程序下载口: UART1_TXD;UART1_RXD 串口2: UART2_TXD;UART2_RXD  (连接了485/422) 
 
 配置串口2,接收到什么回什么
 
 local UART_ID=2 --串口2
 
 
 -- 订阅串口发布消息的主题
 sys.subscribe("uart_write", function(data)
 uart.write(UART_ID, data) --返回接收的数据
 end)
 
 
 uart.on(UART_ID, "receive", function(id, len)
 local data = uart.read(id, 1024)
 sys.publish("uart_write", data) --发布主题为 uart_write 的消息
 end)
 -- 配置串口2,波特率115200,8位数据位.1位停止位,无校验位,小端模式,缓存大小1024字节
 uart.setup(UART_ID, 115200,8,1,uart.None,uart.LSB,1024)
 
 
 
 485接法 
 
 
 
 422接法 
 
 
 
 
 处理串口数据
 1.字符串 
 
 
 
 
 
 
 2.16进制数据 
 
 
 sys.subscribe("uart_write", function(data)
 if  data == "123"  then --接收到 "123" 返回 "456"
 uart.write(UART_ID, "456") --返回接收的数据
 end
 
 
 --接收到 0xaa 0x55  返回 0x01 0x03
 if  data:byte(1) == 0xaa and data:byte(2) == 0x55 then
 local hexdata = string.char(0x01, 0x03)
 uart.write(UART_ID,hexdata)--返回数据
 end
 
 
 end)
 
 
 
 
 
 
 --计算crc  报错,有时间再询问官方
 local RevLen = string.len (data)
 
 local i; local datatable={};
 for  i=1,RevLen do
 datatable = data:byte(i);
 end
 log.info("CRC16=", CRC16(datatable,RevLen));
 
 
 
 
 --计算CRC
 function  CRC16(modbusdata,length)
 local i=0;local j=0;local crc=0;local k=1;local l=1;
 
 for k=1 ,length do
 crc = bit.bxor(crc,modbusdata[k])
 for l=1,8 do
 if  bit.band(crc,1) == 1 then
 crc = bit.rshift(crc,1);
 crc = bit.bxor(crc,0xa001);
 else
 crc = bit.rshift(crc,1);
 end
 end
 end
 return crc;
 end
 
 function CRC16Flage(modbusdata,length)
 local Receive_CRC = 0;local calculation = 1;
 Receive_CRC = CRC16(modbusdata,length-2)
 calculation = modbusdata[length];
 calculation = calculation * 256;
 calculation = calculation + modbusdata[length-1];
 if  Receive_CRC == calculation then
 return 1;
 else
 return 0;
 end
 end
 
   
 
 
 
 
 |