zoukankan      html  css  js  c++  java
  • 2.5-Air302(NB-IOT)-基础外设-串口(485,422),CRC校验

    <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

     

  • 相关阅读:
    BZOJ3813 奇数国
    BZOJ2735 世博会
    BZOJ2081 [Poi2010]Beads
    BZOJ3276 磁力
    BZOJ2054 疯狂的馒头
    BZOJ2610 [Poi2003]Monkeys
    BZOJ2428 [HAOI2006]均分数据
    BZOJ2120 数颜色
    BZOJ2527 [Poi2011]Meteors
    补比赛——牛客OI周赛9-普及组
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/13796750.html
Copyright © 2011-2022 走看看