Luatos Air700 改变BL0942串口波特率

 LuatOs 改变模块串口波特率思路参照

luatos 改变AIR530串口波特率

BL0942默认串口波特率可以通过SCLK_BPS引脚接3.3V电源设置到9600bps

 但如果调整到38400bps需要修改0x19寄存器

 bl0942 v1.06版的特殊寄存器说明,注意早期版本特殊寄存器说明存在错误

 

 完整代码

main.lua


-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "EMQX_Plug"
VERSION = "1.0.1"

--[[
本demo需要mqtt库, 大部分能联网的设备都具有这个库
mqtt也是内置库, 无需require
]]

-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用mqtt库需要下列语句]]
_G.sysplus = require("sysplus")

-- 自动低功耗, 轻休眠模式
-- Air780E支持uart唤醒和网络数据下发唤醒, 但需要断开USB,或者pm.power(pm.USB, false) 但这样也看不到日志了
-- pm.request(pm.LIGHT)

-- 串口ID,串口读缓冲区
local bl0942 = require "bl0942"
local UART_ID1, UART1receQueue = 1, {}
local uartimeout, UART1recvReady = 25,"UART_RECV_ID1"


local RD_SPECIAL_REGISTER_FLAG=0
local RD_DATA_REGISTER_FLAG=0 
local BAUD_CHANGED_FLAG=0                                                                                                                   
local LED   = gpio.setup(31, 1, gpio.PULLUP)
local RELAY = gpio.setup(9, 1, gpio.PULLUP)
LED(1)


if wdt then
    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
    wdt.init(9000)--初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end



-- 最常用115200 8N1
local result1 = uart.setup(
    UART_ID1,--串口id
    9600,--波特率
    8,--数据位
    1--停止位
)
print(_VERSION)

sys.taskInit(function()
        log.info("初始化","bl0942软件复位")
        BL0942_Write(UART_ID1,bl0942.SOFT_RESET,0x5A,0x5A,0x5A)
        sys.wait(100) 
        -- 以下代码设置防潜动阈值寄存器,保证电度数据不会累计噪声形成负值
        BL0942_Write(UART_ID1,bl0942.USR_WRPROT,0x55,0x00,0x00)
        BL0942_Write(UART_ID1,bl0942.WA_CREEP,0x33,0x00,0x00)
                
       --以下改变串口波特率
        BL0942_Write(UART_ID1,bl0942.MODE,0x87,0x03,0x00)
        BSP_FLAG=1
        uart.write(UART_ID1,"     ")--触发uart.on的sent事件--触发uart.on的sent事件
        print("已改变GPS串口波特率")
end)


  uart.on(UART_ID1, "sent", function(uid)
      if BSP_FLAG==1 then 
          -- uart.close(UART_ID1)--此代码注释掉也能实现波特率更改
          result1 = uart.setup(
                   UART_ID1,--串口id
                   38400,--波特率
                   8,--数据位
                   1--停止位
            )
         print("已改变Air700 UART1串口波特率")    
         BL0942_Write(UART_ID1,bl0942.USR_WRPROT,0xff,0x00,0x00)
        sys.publish("38400")
        BSP_FLAG=0
        BAUD_CHANGED_FLAG=1
    end  
end)    

sys.subscribe("38400",function()
     uart.on(UART_ID1, "receive", function(uid, length)
       local s
       while true do--保证读完不能丢包
         s = uart.read(uid, length)
         if #s == 0 then break end
           table.insert(UART1receQueue, s)
         end
      sys.timerStart(sys.publish, uartimeout, UART1recvReady)
    end)
end) 

sys.subscribe(UART1recvReady, function()
       
    if (RD_SPECIAL_REGISTER_FLAG==1) then 
        local m={}
        local strRe = table.concat(UART1receQueue)
        if (#strRe)>4 then --可能会有全电参数数据包的23个字节混入,必须剔除
            return         --读单个寄存器一般返回3个字节
        end 
        -- log.info("特殊寄存器",#strRe)
        UART1receQueue = {}
        RD_SPECIAL_REGISTER_FLAG=0
        m[1]=string.byte(strRe,1)
        m[2]=string.byte(strRe,2)
        m[3]=string.byte(strRe,3)
        -- print(m[1],m[2],m[3])
        local m_temp  =  string.char(m[1],m[2],m[3])
        local mode=string.unpack("i3", m_temp)
        print(string.format("MODE=%d",mode))
  end

  if (RD_DATA_REGISTER_FLAG==1) then
    local v,c,e={},{},{}
    local vol,cur,engerywat
    -- local w,f={},{}
    -- local freq,engery
    local strDA = table.concat(UART1receQueue)
    if (#strDA)<23 then --避免解析读寄存器数据
        return 
    end 
    UART1receQueue = {}
    RD_DATA_REGISTER_FLAG=0
    
    c[1]=string.byte(strDA,2)
    c[2]=string.byte(strDA,3)
    c[3]=string.byte(strDA,4)

    v[1]=string.byte(strDA,5)
    v[2]=string.byte(strDA,6)
    v[3]=string.byte(strDA,7)

    e[1]=string.byte(strDA,14)
    e[2]=string.byte(strDA,15)
    e[3]=string.byte(strDA,16)
    
    local cur_temp  =  string.char(c[1],c[2],c[3])
    local vol_temp  =  string.char(v[1],v[2],v[3])  
    local ene_temp  =  string.char(e[1],e[2],e[3])
    -- local wat_temp  =  string.char(w[1],w[2],w[3]) 
    -- local freq_temp =  string.char(f[1],f[2],f[3]) 
    
    local cur   = string.unpack("i3", cur_temp)
    local vol   = string.unpack("i3", vol_temp)
    local energy= string.unpack("i3", ene_temp)
    -- print(string.format("energy=%d",energy))
    -- local wat   = string.unpack("i3", wat_temp)
    -- local freq  = string.unpack("i3",freq_temp)

     pub_vol=(vol*V_CONSTANT)/V_DENO
     pub_cur=(cur*VREF/I_DENO)*1000  
     pub_energy=(energy*E_PER_PLUSE)
        
     print(string.format("电流=%.1fmA 电压=%.1fV 电度=%0.2f度 ",pub_cur,pub_vol,pub_energy))
    -- print(string.format("电流=%0.2fA 电压=%.1fV 功率=%0.1fW 电度=%0.2f度 频率=%0.1fHz",Current,Voltage,Energy,Wat,Freq))
   end      
end)
local cnt = 0

sys.timerLoopStart(function()
      if BAUD_CHANGED_FLAG==1 then
        uartimeout=25
        BL0942_Read(UART_ID1,0xAA)--V_RMS  0xAA bl0942.V_RMS 读取全电参数数据包
        RD_DATA_REGISTER_FLAG=1 
        RD_SPECIAL_REGISTER_FLAG=0
    end 
end, 1000)

sys.timerLoopStart(function()
    if BAUD_CHANGED_FLAG==1 then
      uartimeout=5
      BL0942_Read(UART_ID1,bl0942.MODE) --读0x19用户模式选择寄存器
      RD_SPECIAL_REGISTER_FLAG=1
      RD_DATA_REGISTER_FLAG=0
    end 
end, 2400)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

 bl0942.lua

local sys = require "sys"

 VREF      = 1.218
 V_DENO    =1842052.2
 V_CONSTANT=121.8
 I_DENO    =504863.7      --305978*(3.3*1000)/2000
 DOUBLE_FS  =1000000.0
 POWER_COEFF=148.3524     --1.218*1.218*20*5
 P_DENO     =145317.645   --3537*(3.3*1000/2000)*0.0249*1000
 E_PER_PLUSE=0.000118942

 bl0942= setmetatable({}, {
    __index = {
        WRITE_HEAD   =      0xA8,  
        READ_HEAD    =      0x58,
        I_WAVE       =      0x01,    --电流波形寄存器,有符号
        V_WAVE       =      0x02,    --电压波形寄存器,有符号
        I_RMS        =      0x03,    --电流有效值寄存器,无符号
        V_RMS        =      0x04,    --电压有效值寄存器,无符号
        I_FAST_RMS   =      0x05,    --电流快速有效值寄存器,无符号
        WATT         =      0x06,    --有功功率寄存器,有符号
        CF_CNT       =      0x07,    --有功电能脉冲计数寄存器,无符号
        FREQ         =      0x08,    --线电压频率寄存器
        STATUS       =      0x09,    --状态寄存器

        ---------用户操作寄存器(读写)--------------------
        I_RMSOS       =      0x12,    --电流有效值小信号校正寄存器
        WA_CREEP      =      0x14,    --有功功率防潜寄存器
        I_FAST_RMS_TH =      0x15,    --电流快速有效值阈值寄存器
        I_FAST_RMS_CYC=      0x16,    --电流快速有效值刷新周期寄存器
        FREQ_CYC      =      0x17,    --线电压频率刷新周期寄存器
        OT_FUNX       =      0x18,   --输出配置寄存器
        MODE          =      0x19,    --用户模式选择寄存器
        GAIN_CR       =      0x1A,    --电流通道增益控制寄存器
        SOFT_RESET    =      0x1C,    --写入 0x5A5A5A 时,用户区寄存器复位
        USR_WRPROT    =      0x1D    --用户写保护设置寄存器。
                                     --写入0x55后,用户操作寄存器可以写入;
                                     --写入其他值,用户操作寄存器区域不可写入
    },
    __newindex = function() end
})


local function Check_ConStat(HEAD,address,data0_7,data8_15,data16_23)
     local sum=HEAD+address+data0_7+data8_15+data16_23
     local sumAnd=bit.band(sum,0xff)
     local checksum=bit.bnot(sumAnd)--这个输出位数大于2个字节,其十进制数位-207 十六进制:FFFF FFFF FFFF FF31
     local result=bit.band(checksum,0xff)--保证校验位1个字节,去除前面的14个FF
    return result;
end


function BL0942_Read(ID,address)
     uart.write(ID,string.char(bl0942.READ_HEAD,address))
end
--
 function BL0942_Write(ID,address,data0_7,data8_15,data16_23)
     local checksum=Check_ConStat(bl0942.WRITE_HEAD,address,data0_7,data8_15,data16_23) 
     uart.write(ID,string.char(bl0942.WRITE_HEAD,address,data0_7,data8_15,data16_23,checksum))
end

return bl0942

    在修改特殊寄存器前,必须0X1D寄存器写入0x55。

        代码实现了读取全电数据包和0x19寄存器的功能,特别注意在分别解析串口返回的数据时,对数据的长度进行了判断,对不符合解析长度的数据包进行了丢弃,保证了数据的准确性。

    另外2个读取循环在延时时间上相互错开,避免遇到同时读取。

MODE=903 即0011 1000 0111,也就是[9:8]=11,波特率调整到了38400bps。

注意:交替循环读会出现电流显示600多ma的数据,目前我还没有解决,如果单独读取全电数据包能正常准确解析数据。读特殊寄存器一般用于调试阶段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121948.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes 问题排查全景图

伴随着混沌的微服务架构&#xff0c;多语言和多网络协议混杂。以及下沉的基础设施能力屏蔽实现细节&#xff0c;问题定界越发困难。 企业急需一种支持多语言&#xff0c;多通信协议的技术&#xff0c;并在产品层面尽可能覆盖软件栈端到端的可观测性需求。 「Kubernetes 问题排查…

java版直播商城免费搭建平台规划及常见的营销模式+电商源码+小程序+三级分销+二次开发

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

idea使用lombok编译问题

idea编译报错问题如下&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy26Lombok supports: OpenJDK javac, ECJ解决方案 1.先将jdk替换为openjdk,随后将项目配置…

如何搭建一个自定义UI框架的Playground(一)

文章目录 初衷需求技术选型详细设计&#xff08;一&#xff09;1.业务设计2.交互设计3.程序设计3.1 游戏生命周期设计3.2 UI界面管理设计 初衷 想要比较系统、深入地了解游戏UI框架的设计与开发&#xff0c;就需要自己实践去开发一个可以预览的UI项目&#xff0c;但是目前没有…

Docker快速搭建Drupal内容管理系统并远程访问

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525;个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal…

在线CRM系统的安全性高吗?企业该如何选择?

在线CRM系统具备门槛低、功能不打折扣、部署周期短等优点&#xff0c;相比本地化部署更加适合中小企业。但很多企业在选型软件时会顾虑在线CRM系统的安全性高吗&#xff1f; 通常情况下厂商会比中小企业更有实力保证数据安全&#xff0c;从技术手段保护企业隐私不被盗用。 数…

数据结构与算法之美学习笔记:16 | 二分查找(下):如何快速定位IP对应的省份地址?

目录 前言二分查找的变形问题变体一&#xff1a;查找第一个值等于给定值的元素变体二&#xff1a;查找最后一个值等于给定值的元素变体三&#xff1a;查找第一个大于等于给定值的元素变体四&#xff1a;查找最后一个小于等于给定值的元素 解答开篇内容小结 前言 本节课程思维导…

第三章:人工智能深度学习教程-人工智能与机器学习与深度学习之间的区别

人工智能基本上是通过一组规则&#xff08;算法&#xff09;将人类智能融入机器的机制。人工智能是两个词的组合&#xff1a;“人工”是指由人类或非自然物体制造的东西&#xff0c;“智能”是指相应地理解或思考的能力。另一个定义可能是“人工智能基本上是训练机器&#xff0…

KeyShot for 3dMax插件教程

KeyShot for 3dMax插件教程 KeyShot是一款先进的3D渲染和动画软件&#xff0c;通过直观、精简的用户界面和革命性的动画工作流简化了整个媒体创建过程&#xff0c;可以实时创建完全渲染的动画。 快速 立即查看结果。 这就是KeyShot渲染引擎的功能&#xff1a;您所做的每一个更…

鸿蒙原生应用开发-DevEco Studio远程真机的使用

一、先看看远程真机支持的机型情况相比本地和模拟器多了很多机型 二、远程真机使用的相关说明 该特性在DevEco Studio V2.2 Beta1及更高版本中支持。 如果开发者没有真机设备资源&#xff0c;则不能很方便的调试和验证HarmonyOS应用&#xff0c;为方便开发者&#xff0c;De…

U-Mail邮件系统安全登录解决方案

企业邮箱是企业对内对外商务往来的主要通信工具&#xff0c;并且企业邮箱里面还包含了大量企业内部隐私信息、商业机密等&#xff0c;很容易成为黑客的攻击目标。其中邮件盗号是企业邮箱遭受攻击的主要形式&#xff0c;一旦企业邮箱密码被黑客盗取&#xff0c;黑客不仅可以利用…

中国人民大学与加拿大女王大学金融硕士——在金融领域里持续探索、成长

在金融领域里持续探索、成长&#xff0c;这是一个永无止境的旅程。在这个领域里&#xff0c;机遇与挑战并存&#xff0c;未知与已知交织&#xff0c;需要我们时刻保持敏锐的洞察力和扎实的基本功。金融市场的变化日新月异&#xff0c;我们需要时刻关注市场动态&#xff0c;了解…

Tcl语言:SDC约束命令create_generated_clock详解(下)

相关阅读 Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm1001.2014.3001.5482 设定生成时钟特性 前文的末尾提到&#xff0c;当使用-divide by或-multiply_by选项创建生成时钟时&#xff0c;会根据master clock的时钟周期派生出生成时钟的周期&am…

C++ explicit关键字的作用

explicit关键字只针带一个参数的构造函数有效 #include <iostream> using namespace std;class A { public:A(int temp) //普通构造函数{a temp;cout << "普通构造函数: a " << a << endl;}A(const A &temp) //拷贝构造函数{a temp.a…

C++对象优化

用临时对象生成新对象的时候&#xff0c;临时对象就不产生了&#xff0c;直接构造新对象

校园图书馆自习室管理系统 毕业设计源码25035

赠送源码-毕业设计&#xff1a;SSM校园图书馆自习室管理系统https://www.bilibili.com/video/BV1iN4y1k7xw/?vd_source72970c26ba7734ebd1a34aa537ef5301 SSM校园图书馆自习室座位管理系统 摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;…

二十、W5100S/W5500+RP2040树莓派Pico<MQTT连接阿里云控制板载LED>

1. 前言 物联网平台提供安全可靠的设备连接通信能力&#xff0c;支持设备数据采集上云&#xff0c;规则引擎流转数据和云端数据下发设备端。此外&#xff0c;也提供方便快捷的设备管理能力&#xff0c;支持物模型定义&#xff0c;数据结构化存储&#xff0c;和远程调试、监控、…

es6过滤对象里面指定的不要的值filter过滤

//过滤出需要的值this.dataItemTypeSelectOption response.data.filter(ele > ele.dictValue tree||ele.dictValue float4);//过滤不需要的值this.dataItemTypeSelectOption response.data.filter((item) > {return item.dictValue ! "float4"&&it…

Note1: 算法的时间复杂度和空间复杂度

目录 ---前言 1.算法效率 1.1 算法的复杂度 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 2.3.1 示例1 2.3.2 示例2 2.3.3 示例3 2.3.4 示例4 2.3.5 示例5 2.3.6 示例6 2.3.7 示例7 2.3.8 示例8 3.空间复杂度 3.1 示例1 …