AIR700 改变AIR530Z串口波特率

2023-11-03 13:28

本文主要是介绍AIR700 改变AIR530Z串口波特率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AIR530Z串口波特率默认9600,但实际应用中需要更高的波特率,可选波特率见下图。

   主控采用合宙AIR700E核心板,通过UART1连接AIR530Z

   合宙Luatos uart官方文档

主要问题

         AIR700E要改变AIR530Z的波特率,在默认9600波特率情况下通过发送“$PCAS01,5*19\r\n”即可,之后改变AIR700E UART1到指定波特率即可。

        但改变AIR700E波特率同时,AIR530Z一直在发送数据,如果已经编写uart.on的receive事件响应函数话,那重新设定AIR700E的波特率的进程就会被打断,最后导致系统崩溃。现在的问题是找到保证设定波特率进程不被打断的方法,经咨询合宙技术支持和查阅文档,只能利用uart.on的sent事件保护并完成波特率设定。

         但悲催的是uart.on的sent事件在uart.write发送第一字符时就会触发,如果此时如下编写,一定达不到预期效果,因为改变AIR530Z的数据还发送完,主机就改变波特率了。

uart.on(UART_ID1, "sent", function(uid)result1 = uart.setup(UART_ID1,--串口id115200,--波特率8,--数据位1--停止位)print("已改变Air700 UART1串口波特率")    uart.write(UART_ID1,"$PCAS02,1000*2E\r\n")--设置定位更新率1Hz
end)    

解决办法

        经过多次试验,发现找到改变AIR700E的UART1串口的有效方法。

代码1
sys.taskInit(function()uart.write(UART_ID1,"$PCAS01,5*19\r\n")BSP_FLAG=1uart.write(UART_ID1,"     ")--触发uart.on的sent事件print("已改变GPS串口波特率")    
end)
 代码2
uart.on(UART_ID1, "sent", function(uid)if BSP_FLAG==1 then uart.close(UART_ID1)result1 = uart.setup(UART_ID1,--串口id115200,--波特率8,--数据位1--停止位)print("已改变Air700 UART1串口波特率")    uart.write(UART_ID1,"$PCAS02,1000*2E\r\n")--设置定位更新率1Hzsys.publish("115200")BSP_FLAG=0end  
end)    

        代码1中利用BSP_FLAG全局变量实现在uart.on的sent事件响应函数中只能改变一次波特率。BSP_FLAG=1时,但 uart.on的sent事件外部条件已经消失,导致代码2不会执行。

       此时最关键又看似没用的是uart.write(UART_ID1,"     "),它再次触发uart.on的sent事件,结合BSP_FLAG==1条件开启UART1的波特率的设定。成功改变波特率之后通过消息设置uart.on的receive事件的响应,接收AIR530Z发送的信息。

    通过串口反馈的信息可以看到波特率改变成功。

[2023-11-03 09:00:54.869] 工具提示: soc log port COM12打开成功
[2023-11-03 09:00:54.923] 工具提示: ap log port COM10打开成功
[2023-11-03 09:00:54.928] 工具提示: 用户虚拟串口 COM11
[2023-11-03 09:00:54.998][000000000.011] BSP_CustomInit 444:fault mode 2 not safe ,change to 3
[2023-11-03 09:00:54.998][000000000.011] Uart_BaseInitEx 1032:uart 0 rx cache 256 dma 256
[2023-11-03 09:00:54.998][000000000.206] I/pm poweron: Power/Reset
[2023-11-03 09:00:54.998][000000000.206] I/main LuatOS@EC618 base 22.12 bsp V1107 32bit
[2023-11-03 09:00:54.998][000000000.206] I/main ROM Build: Jul 10 2023 15:23:28
[2023-11-03 09:00:54.998][000000000.213] D/main loadlibs luavm 262136 13504 13536
[2023-11-03 09:00:55.009][000000000.213] D/main loadlibs sys   286384 53792 57008
[2023-11-03 09:00:55.009][000000000.223] I/user.main	AIR700E_UART1_AIR530Z	1.0.0
[2023-11-03 09:00:55.009][000000000.238] I/user.main	AIR700 UART1改变AIR530Z串口波特率
[2023-11-03 09:00:55.009][000000000.239] Uart_BaseInitEx 1032:uart 1 rx cache 2048 dma 512
[2023-11-03 09:00:55.009][000000000.242] 已改变GPS串口波特率
[2023-11-03 09:00:55.009][000000000.261] Uart_BaseInitEx 1032:uart 1 rx cache 2048 dma 512
[2023-11-03 09:00:55.018][000000000.262] 已改变Air700 UART1串口波特率
[2023-11-03 09:00:55.018][000000000.385] self_info 125:model Air700E_A11 imei 864269064914126
[2023-11-03 09:00:55.018][000000000.428] $GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,N*7A
$GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,1*01
$GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,4*04
$GPGSV,1,1,00,0*65
$BDGSV,1,1,00,0*74
$GNRMC,,V,,,,,,,,,,N,V*37
$GNVTG,,,,,,,,,N*2E
$GNZDA,,,,,,*56
$GPTXT,01,01,01,ANTENNA OK*35[2023-11-03 09:00:55.369][000000000.862] D/mobile CSCON 1
[2023-11-03 09:00:55.939][000000001.426] $GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,N*7A
$GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,1*01
$GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,4*04
$GPGSV,1,1,00,0*65
$BDGSV,1,1,00,0*74
$GNRMC,,V,,,,,,,,,,N,V*37
$GNVTG,,,,,,,,,N*2E
$GNZDA,,,,,,*56
$GPTXT,01,01,01,ANTENNA OK*35[2023-11-03 09:00:56.439][000000001.904] D/mobile cid1, state0
[2023-11-03 09:00:56.439][000000001.905] D/mobile bearer act 0, result 0
[2023-11-03 09:00:56.444][000000001.906] D/mobile NETIF_LINK_ON -> IP_READY
[2023-11-03 09:00:56.448][000000001.941] D/mobile TIME_SYNC 0
[2023-11-03 09:00:56.935][000000002.425] $GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,N*7A
$GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,1*01
$GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,4*04
$GPGSV,1,1,00,0*65
$BDGSV,1,1,00,0*74
$GNRMC,,V,,,,,,,,,,N,V*37
$GNVTG,,,,,,,,,N*2E
$GNZDA,,,,,,*56
$GPTXT,01,01,01,ANTENNA OK*35

 

完整代码

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "AIR700E_UART1_AIR530Z"
VERSION = "1.0.0"log.info("main", PROJECT, VERSION)-- 引入必要的库文件(lua编写), 内部库不需要require
local sys = require "sys"
local  UART1_AT_Receive
local  CON_STAT_FLAG=0
if wdt then--添加硬狗防止程序卡死,在支持的设备上启用这个功能wdt.init(15000)--初始化watchdog设置为15ssys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗
endlog.info("main","AIR700 UART1改变AIR530Z串口波特率")-- 串口ID,串口读缓冲区
-- local UART_ID0, UART0sendQueue = 0, {}
local UART_ID1, UART1sendQueue = 1, {}
-- 串口超时,串口准备好后发布的消息
--例子是100ms,按需求改
local uartimeout, UART1recvReady= 50,"UART_RECV_ID1"
--初始化
local LED   = gpio.setup(27, 1, gpio.PULLUP)--监视串口是否正常工作
local BSP_FLAG=0
local result1 = uart.setup(UART_ID1,--串口id9600,--波特率8,--数据位1--停止位
)
sys.taskInit(function()uart.write(UART_ID1,"$PCAS01,5*19\r\n")BSP_FLAG=1uart.write(UART_ID1,"     ")--触发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,--串口id115200,--波特率8,--数据位1--停止位)print("已改变Air700 UART1串口波特率")    uart.write(UART_ID1,"$PCAS02,1000*2E\r\n")--设置定位更新率1Hzsys.publish("115200")BSP_FLAG=0end  
end)    local function isempty(s)--判断字符串是否为空return s == nil or s == ''
end
local count = 0--闪烁LED计数器
sys.subscribe("115200",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(UART1sendQueue, s)LED(count % 3 == 0 and 1 or 0)count = count + 1if count==5000 then count=0endendsys.timerStart(sys.publish, uartimeout, UART1recvReady)end)
end) -- 向串口发送收到的字符串
sys.subscribe(UART1recvReady, function()local link_stat,recv_len--拼接所有收到的数据local str = table.concat(UART1sendQueue)-- 串口的数据读完后清空缓冲区UART1sendQueue = {}print(str)end)-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

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



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

相关文章

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