Luatos Air700 改变BL0942串口波特率

2023-11-08 09:12

本文主要是介绍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 = 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设置为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=15BL0942_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。

这篇关于Luatos Air700 改变BL0942串口波特率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/368956

相关文章

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli

linux下非标准波特率的设置和使用

通常,在linux下面,设置串口使用终端IO的相关函数设置,如tcsetattr等函数,linux内部有一个对常用波特率列表的索引,根据设置的波特率用底层驱动来设置异步通信芯片的寄存器 对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和ioctl(fd, TIOCSSERIAL, p)的配合,ioctl的最后一个参数是struct serial_struct *

安卓开发板_联发科MTK开发评估套件串口调试

串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器,按芯片来分,有以下几种: CH340PL2303CP2104FT232 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

【前端】animation动画以及利用vue制作简单的透明度改变动画,包含vue生命周期实现

一. 问题描述 想做一个文字透明度从1到0然后再从0到1的css动画。 二. 代码写法 2.1 animation写法 2.1.1 animation属性key 2.1.2 代码展示 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=de

HTML5如何成为改变移动互联网幕后的推手

在未来的某一天,我们打开手机,不再需要访问手机应用商店,不论是 Apple的还是Google的,我们只需要点击手机主菜单页面上的一个链接,手机就会立即在它的浏览器上启动一个 “应用程序”;再也不需要flash插件,就能欣赏华丽丽视频画面。   AD:2013云计算架构师峰会课程资料下载   2012年,说HTML5集千宠万爱于一身也毫不夸张,IE、Chrome、Firefox和Opera等

心觉:如何用一颗心改变世界和自己

关于如何开发自己的潜意识开发的底层逻辑和注意事项 我这里就不赘述了,可以看我前面的文章 今天主要讲一下,如何让我们祈祷的作用发挥到极致 这里提到了祈祷,其实就是正念 把自己的梦想,目标,愿望通过积极的语言 或者生动形象的画面告诉自己的潜意识 你的这些梦想,目标,愿望就会慢慢地变成现实 这是真的,有无数的案例可以证实 我这里就不举例子了,大家可以网上搜 我只讲一下,为什么有些人

java RXTXcomm 串口通信

RXTXcomm:提供了 Windows x64, x86, ia64 and Linux x86, x86_64等操作系统支持。 下载地址 http://fizzed.com/oss/rxtx-for-java 使用RXTXcomm首先要安排JRE环境,开发IED可能eclipse. 1.下载系统相应的RXTXcomm。 2.将rxtxSerial.dll、rxtxParallel.dl

Nodejs 串口通信 : websocket , serialport

最近在学习如何实现web页面和串口间通信,网页请求使用websocket,实现的基本功能如下: 1、基本需求:硬件:有两个信号灯(TLA-505-1T),一个485继电器(开关),电压转换器,工业触屏一体机。 2、原理图:                  3工作原理: 首先一体机中采用node开发服务器,网页请求采用websocket协议,直接放代码了: var express