Luatos Air700 改变BL0942串口波特率

news2024/12/23 17:14:08

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

luatos 改变AIR530串口波特率

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

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

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

 

 完整代码


-- 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 = 15,"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=15
        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()之后后面不要加任何语句!!!!!

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java进阶(再论线程)——线程的4种创建方式 线程的生命周期 线程的3大特性 集合中的线程安全问题

前言 多线程作为编程语言中的难点&#xff0c;虽然初级程序员可能很少遇到线程相关的开发任务&#xff0c;但是作为程序员&#xff0c;持续学习和保持对编程的热爱&#xff0c;要求我们对于线程也需要有一定的认识。 本篇博客介绍Java中创建线程的4种方式&#xff0c;并进行了…

【环境装配】Anaconda在启动时闪现黑框,闪几次后仍能正常使用,解决黑框问题

anaconda闪黑框这个问题遇到好久了&#xff0c;也没找到相关资料来解决&#xff0c;今天做了两个更新&#xff0c;刚好可以不闪黑框了&#xff0c;记录一下。 更新anaconda 在界面右上角的位置点击更新&#xff0c;更新完后再打开时只闪现两个黑框了&#xff0c;之前好像有五…

UE5 c++将自定义UserWdiget添加到对应菜单栏

前言&#xff1a; 为了实现与UserWidget一致的右键添加&#xff0c;便有了此章 注&#xff1a;这里使用的是UE5.3 目标内容&#xff1a; 这里可以参考UserWidget的源码&#xff0c;拷贝一份属于自己的就ok&#xff08;本篇章只是全改成了属于自己的CommonUserWidget&#xff…

定时发圈怎么设置?

微信本身是不能定时发送朋友圈的。微信公众号可以定时发送&#xff0c;微博可以定时发送&#xff0c;那微信可不可以也定时发送呢&#xff1f;当然可以&#xff0c;只要用这个方法&#xff0c;微信也能实现定时发朋友圈&#xff0c;不用再守着时间发朋友圈了。

USB HID在系统下通信的一些总结

前言 这篇文章主要介绍在PC&#xff08;上位机&#xff0c;Host&#xff09;端&#xff0c;通过HID与硬件进行通信的一些总结&#xff0c;像很多同学肯定和我一样压根不想 去了解什么USB相关的资料&#xff0c;毕竟USB太复杂了&#xff0c;只想有个API给我们进行下数据就好了&…

3D视觉引导纸箱拆码垛,助力物流行业转型升级

近年来&#xff0c;自动化和智能化技术在各行业的应用越来越广泛&#xff0c;特别是在物流和仓储领域。纸箱拆码垛是物流仓储中的一个重要环节。 人工分拣效率低、错误率高、成本高&#xff0c;传统的拆码垛设备存在兼容性差&#xff0c;对纸箱的识别率不高、操作不灵活等问题…

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata

文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…

渗透实战靶机2wp

0x00 简介 1、测试环境 目标IP&#xff1a;10.xxxx 测试IP&#xff1a;192.168.139.128 测试环境&#xff1a;win10、kali等 测试时间&#xff1a;2021.7.22-2021.7.22 测试人员&#xff1a;ruanruan 2、测试过程 本次实战主要通过对收集到的端口、目录等信息进行持续整…

​怎么测试websocket接口

在部分业务中&#xff0c;我们需要使用长连接&#xff0c;我们可以使用http长连接或者websocket&#xff0c;开发结束后难免会遇到测试问题&#xff0c;这里推荐2个&#xff0c;一个是postman&#xff0c;一个是网站 postman 测试网站 测这边推荐测试网站&#xff0c;支持ws/w…

赴日工作赴日IT 如何找到一份日本IT工作?

IT在日本属于普通白领工作&#xff0c;那些想靠IT工作发财就不必考虑了。但是靠IT工作能安安稳稳的过个自己的小日子没问题&#xff0c;买房买车问题不大&#xff0c;作为一个普通人&#xff0c;在日本可以过的比较舒服。对有在日本长期发展的打算的还算是一个比较好的方向&…

Vue创建浅层响应式数据

shallowReactive&#xff1a;只处理对象第一层数据的响应式&#xff08;浅响应式&#xff09;。 shallowRef&#xff1a;只处理基本数据类型的响应式&#xff0c;不处理对象类型的响应式。 shallowReactive 适用于&#xff1a;如果有一个对象类型的数据&#xff0c;结构比较深…

【软考】2023下半年系统集成项目管理工程师案例分析真题(第五批次)

2023下半年系统集成项目管理工程师案例分析真题&#xff08;第五批次&#xff09; 案例一 (17分)-配置管理案例二 &#xff08;20分&#xff09;-进度管理案例三 &#xff08;18分&#xff09;-风险管理案例四 - 人力资源管理 系列文章版本记录 案例一 (17分)-配置管理 某游戏公…

【Spring】@Component组件

大前提&#xff1a; 添加了相关的约束文件以及注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:…

理解JavaScript模运算符

本文翻译自 Understanding the JavaScript Modulo Operator&#xff0c;作者&#xff1a;joshwcomeau&#xff0c; 略有删改。 当我第一次学习编码时&#xff0c;我记得发现模运算符&#xff08;%&#xff09;非常令人困惑。&#x1f62c; 当你不明白它的原理的时候&#xff0…

深度学习之基于YoloV5-Deepsort人物识别与追踪系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 YoloV5-Deepsort是一种基于深度学习的人物识别与追踪系统&#xff0c;具有较高的准确率和实时性能。 YoloV5是一种…

4.三大基础排序 -选择排序、冒泡排序、插入排序

排序算法 文章目录 冒泡排序算法步骤动图代码优化总结 选择排序算法步骤动图代码总结 插入排序算法步骤动图代码总结 排序算法&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。一般默认排序是按照由小到大即…

2.HTML中常用浏览器

2.常用浏览器 2.1 什么是浏览器 浏览器是网页显示&#xff0c;运行的平台。常用的浏览器有IE&#xff0c;火狐&#xff0c;谷歌&#xff0c;Safari和Opera等 平时成为五大浏览器 2.2 浏览器内核 浏览器内核&#xff08;渲染引擎&#xff09;&#xff1a;负责读取网页内容&…

用CMake编译项目 CMake和g++的区别

0.同样是编译c文件有了g为什么又出了个CMake&#xff1f; g适用于要编译的文件较少的情况。 而CMake像是写好的脚本&#xff0c;可以一键编译很多c文件。一.创建项目和CMakeLists.txt文件 1.1 创建一个项目&#xff0c;目录结构如下 1.2 在项目的根目录下创建一个CMakeLists.…

个人常用Linux命令

来自 linux命令学习-2023-8-1 153913.md等 1、切换目录 cd //切换目录 cd change directory cd 目录名 cd .. 返回上一级目录 pwd显示当前所处目录cd 绝对路径 cd ~ 表示一个用户的home目录 cd - 表示上一次访问的目录 cd / 表示进入根目录下//新建目录/data,并且进入/data…

001、Nvidia Jetson Nano Developer KIT(b01)-系统与登录

之——镜像烧录与远程登录 杂谈 Nvidia Jetson Nano Developer KIT&#xff08;b01&#xff0c;4G&#xff09;&#xff0c;系统配置全纪录&#xff0c;镜像烧录、系统安装、远程桌面安装、cuda与torch安装、pycharm、pycuda、tensorrt等等。 正文 1.开发板系统安装 1.1 开发…