首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2.5-Air302(NB-IOT)-基础外设-串口(485,422),CRC校验

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

作者头像
杨奉武
发布2020-10-23 16:21:45
5790
发布2020-10-23 16:21:45
举报
文章被收录于专栏:知识分享知识分享

<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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 电路说明
  • 配置串口2,接收到什么回什么
  • 处理串口数据
  • 补充 CRC校验
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档