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设置为9ssys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end-- 最常用115200 8N1
local result1 = uart.setup(UART_ID1,--串口id9600,--波特率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=1uart.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,--串口id38400,--波特率8,--数据位1--停止位)print("已改变Air700 UART1串口波特率")    BL0942_Write(UART_ID1,bl0942.USR_WRPROT,0xff,0x00,0x00)sys.publish("38400")BSP_FLAG=0BAUD_CHANGED_FLAG=1end  
end)    sys.subscribe("38400",function()uart.on(UART_ID1, "receive", function(uid, length)local swhile true do--保证读完不能丢包s = uart.read(uid, length)if #s == 0 then break endtable.insert(UART1receQueue, s)endsys.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=0m[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))endif (RD_DATA_REGISTER_FLAG==1) thenlocal v,c,e={},{},{}local vol,cur,engerywat-- local w,f={},{}-- local freq,engerylocal strDA = table.concat(UART1receQueue)if (#strDA)<23 then --避免解析读寄存器数据return end UART1receQueue = {}RD_DATA_REGISTER_FLAG=0c[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_DENOpub_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 = 0sys.timerLoopStart(function()if BAUD_CHANGED_FLAG==1 thenuartimeout=25BL0942_Read(UART_ID1,0xAA)--V_RMS  0xAA bl0942.V_RMS 读取全电参数数据包RD_DATA_REGISTER_FLAG=1 RD_SPECIAL_REGISTER_FLAG=0end 
end, 1000)sys.timerLoopStart(function()if BAUD_CHANGED_FLAG==1 thenuartimeout=5BL0942_Read(UART_ID1,bl0942.MODE) --读0x19用户模式选择寄存器RD_SPECIAL_REGISTER_FLAG=1RD_DATA_REGISTER_FLAG=0end 
end, 2400)-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

 bl0942.lua

local sys = require "sys"VREF      = 1.218V_DENO    =1842052.2V_CONSTANT=121.8I_DENO    =504863.7      --305978*(3.3*1000)/2000DOUBLE_FS  =1000000.0POWER_COEFF=148.3524     --1.218*1.218*20*5P_DENO     =145317.645   --3537*(3.3*1000/2000)*0.0249*1000E_PER_PLUSE=0.000118942bl0942= 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_23local sumAnd=bit.band(sum,0xff)local checksum=bit.bnot(sumAnd)--这个输出位数大于2个字节,其十进制数位-207 十六进制:FFFF FFFF FFFF FF31local result=bit.band(checksum,0xff)--保证校验位1个字节,去除前面的14个FFreturn result;
endfunction 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))
endreturn bl0942

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java算法(三): 判断两个数组是否为相等 → (要求:长度、顺序、元素)相等

Java算法&#xff08;三&#xff09; 需求&#xff1a; 1. 定义一个方法&#xff0c;用于比较两个数组是否相同2. 需求&#xff1a;长度&#xff0c;内容&#xff0c;顺序完全相同package com.liujintao.compare;public class SameArray {public static void main (String[] a…

使用CMake引入第三方so库及头文件并调用头文件声明的函数

首先,要调用别人的so库和头文件,我们自己项目中需要有NDK。 因为只有C++代码才能直接调用C++代码,也就是头文件和so库的函数。 其次,就是要想办法把头文件,so库和项目中的NDK关联起来,然后作为一个整体,生成一个jni,供Java层调用。 最后,二者的关联是通过CMake完成的…

集合贴2——数据

基础课10——人工智能的基础&#xff1a;大数据-CSDN博客文章浏览阅读126次。人工智能和大数据是相互依存、相互促进的关系。大数据是人工智能的重要基础&#xff0c;没有大数据&#xff0c;人工智能就难以发挥其作用。同时&#xff0c;人工智能也提供了处理和分析大数据的工具…

Capto2024专为Mac电脑设计的屏幕录制和视频编辑软件

不得不说视频编辑功能&#xff1a;Capto提供了多种视频编辑功能&#xff0c;例如剪辑、旋转、裁剪、调整音频和视频的音量、加入水印、添加注释等&#xff0c;你能够使用Capto编辑你的视频&#xff0c;使之更加专业和生动。有目共睹的是录制完成后&#xff0c;你能够使用Capto提…

鸿蒙开发工具DevEco Studio的下载和安装

一、DevEco Studio概述 1、简介 HUAWEI DevEco Studio&#xff08;获取工具请单击链接下载&#xff0c;以下简称DevEco Studio&#xff09;是基于IntelliJ IDEA Community开源版本打造&#xff0c;为运行在HarmonyOS和OpenHarmony系统上的应用和服务&#xff08;以下简称应用…

RS232通讯转485通讯接线心得

最近在接can 485 232的通讯线&#xff0c;无可避免的遇到了一系列问题&#xff0c;各个厂家之间的引脚定义不太一样&#xff0c;这就导致我们要经常的接线&#xff0c;现在也是有了一点心得所以记录下来。接下来进入标题&#xff1a; 目前我遇到的问题是&#xff1a;转接泰琪丰…

asp.net生产线远程故障诊断系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 生产线远程故障诊断系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用 c#语言开发 asp.net生产线远程故障诊断…

Gorm 中的钩子和回调

一个全面的指南&#xff0c;利用 GORM 中的钩子和回调的力量&#xff0c;为定制的数据库工作流程 在数据库管理领域&#xff0c;定制化是打造高效和定制化工作流程的关键。GORM&#xff0c;这个充满活力的 Go 对象关系映射库&#xff0c;为开发人员提供了钩子和回调的功能&…

程序员想要网上接单?那这几点注意事项你可要记好了!不看后悔!

相信网上接单对于程序员来说并不陌生&#xff0c;甚至有些程序员还以此为主业&#xff0c;靠网上接单来增加收入&#xff0c;维持生计&#xff0c;但是你真的确定你懂网上接单的套路吗&#xff1f;你知道网上接单的注意事项吗&#xff1f;这期文章就来盘点一下&#xff0c;无论…

腾讯云3年云服务器价格及购买教程

腾讯云作为国内领先的云计算服务提供商&#xff0c;提供了多种优惠的云服务器套餐&#xff0c;以满足不同用户的需求&#xff0c;本文将详细介绍腾讯云3年云服务器价格及购买教程&#xff0c;新老用户均可购买&#xff01; 1、活动页面&#xff1a;传送门>>> 2、进入…

Git 代码库 gogs 部署私服及 https 配置手册

背景 玩了一下 Git &#xff0c;想到一个问题&#xff1a;企业内部怎么用 Git 呢&#xff1f;仓库哪里来呢&#xff1f; 理一理 Git 及其相关产品的区别&#xff1a; Git 分布式版本管理工具。GitHub 和 Gitee &#xff0c;基于 Git 的互联网代码托管平台&#xff0c;一个是…

【工具】旋转图片-数据集制作工具, 开源!

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] Github&#xff1a;https://github.com/1061700625/small_tools_v2 之前做了一个下载百度的旋转图片验证码的工具(多进程下载百度旋转验证码图片-制作数据集)&#xff0c;那么拿到了图片数据&#xff0c;就需要手…

Flink集群的搭建

1、Flink独立集群模式 1、首先Flink的独立集群模式是不依赖于Hadoop集群。 2、上传压缩包&#xff0c;配置环境&#xff1a; 1、解压&#xff1a; tar -zxvf flink-1.15.2-bin-scala_2.12.tgz2、配置环境变量&#xff1a;vim /etc/profileexport FLINK_HOME/usr/local/soft/fl…

基于机器学习的 ICU 脑血管疾病死亡风险智能预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 重症患者或重大手术后的患者在重症监护室&#xff08;ICU&#xff09;内通过多种生命支持系统以维持生理功能。患者在ICU 内会被频繁持续的记录生命体征和实验室测量等多种数据。由于高频…

SpringBoot系列之集成Redission入门与实践教程

Redisson是一款基于java开发的开源项目&#xff0c;提供了很多企业级实践&#xff0c;比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用 软件环境&#xff1a; JDK 1.8 SpringBoot 2.2.1 Maven 3.2…

CATIA环境编辑器用不了时创建项目快捷方式

CATIA环境编辑器用不了时创建项目快捷方式 一、参考适用情况示例二、 解决步骤(一) 先正确放置winb_64部署包(二) 添加环境文件(三) 修改加入的环境文件(四) 复制本机CATIA快捷方式后重命名(五) 修改快捷方式目标的值 一、参考适用情况示例 二、 解决步骤 (一) 先正确放置winb…

一文掌握 Apache SkyWalking

Apache SkyWalking SkyWalking是一个开源可观测平台&#xff0c;用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking 提供了一种简单的方法来保持分布式系统的清晰视图&#xff0c;甚至跨云。它是一种现代APM&#xff0c;专为云原生、基于容器的分布式系…

几个月大的幼猫怎么喂?性价比高的幼猫主食罐头推荐

我这些年在经营宠物店的过程中发现&#xff0c;许多铲屎官在猫咪约2个月大时会选择带它们回家喂养。然而&#xff0c;他们可能不知道如何为这个阶段的幼猫提供适当的营养。实际上&#xff0c;幼猫所需的营养成分与成年猫相似&#xff0c;都是高蛋白、中高脂肪和低碳水。而且在这…

【JavaScript】window 对象、location 对象、navigator 对象和 history 对象

1. window 对象 BOM (Browser Object Model ) 是浏览器对象模型&#xff1a; window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的所有通过var定义在全…

AI+BI行业数字化转型研讨会 - 总结精华回顾

带您一起观看研讨会精彩内容回顾&#xff01; || 导语 AIBI行业数字化转型研讨会—引领未来&#xff0c;智慧转型 德昂信息技术(北京)有限公司于2023年10月26日成功举办了AIBI行业数字化转型研讨会。此次盛会汇聚了产业精英、企业领袖以及技术专家&#xff0c;共同探讨在快速…