<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn-NB-IOT-Air302-ForLua" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
电路说明
模块有三个串口:
日志打印口: 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校验
--计算crc 报错,有时间再询问官方 local RevLen = string.len (data) local i; local datatable={}; for i=1,RevLen do datatable[i] = 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