18363890557 发表于 2020-10-11 16:55:10

2.5-Air302(NB-IOT)-基础外设-串口(485/422),CRC校验



电路说明模块有三个串口: 日志打印口: HOST_TXD;HOST_RXDAT/程序下载口: 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)
    ifdata == "123"then --接收到 "123" 返回 "456"
      uart.write(UART_ID, "456") --返回接收的数据
    end


    --接收到 0xaa 0x55返回 0x01 0x03
    ifdata: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={};
    fori=1,RevLen do
         datatable = data:byte(i);
    end
    log.info("CRC16=", CRC16(datatable,RevLen));




--计算CRC
functionCRC16(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)
      for l=1,8 do
            ifbit.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;
    calculation = calculation * 256;
    calculation = calculation + modbusdata;
    ifReceive_CRC == calculation then
      return 1;
    else
      return 0;   
    end
end





页: [1]
查看完整版本: 2.5-Air302(NB-IOT)-基础外设-串口(485/422),CRC校验