AIR700 改变AIR530Z串口波特率

news2024/11/30 0:38:24

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,--串口id
               115200,--波特率
               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=1
    uart.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,--串口id
               115200,--波特率
               8,--数据位
               1--停止位
     )
     print("已改变Air700 UART1串口波特率")    
     uart.write(UART_ID1,"$PCAS02,1000*2E\r\n")--设置定位更新率1Hz
     sys.publish("115200")
     BSP_FLAG=0
    end  
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设置为15s
    sys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗
end

log.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,--串口id
    9600,--波特率
    8,--数据位
    1--停止位
)
sys.taskInit(function()
    uart.write(UART_ID1,"$PCAS01,5*19\r\n")
    BSP_FLAG=1
    uart.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,--串口id
               115200,--波特率
               8,--数据位
               1--停止位
     )
     print("已改变Air700 UART1串口波特率")    
     uart.write(UART_ID1,"$PCAS02,1000*2E\r\n")--设置定位更新率1Hz
     sys.publish("115200")
     BSP_FLAG=0
    end  
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 s
      
       while true do--保证读完不能丢包
         s = uart.read(uid, length)
         if #s == 0 then break end
         table.insert(UART1sendQueue, s)
         LED(count % 3 == 0 and 1 or 0)
         count = count + 1
         if count==5000 then 
            count=0
         end
      end
      sys.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()之后后面不要加任何语句!!!!!

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

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

相关文章

跨境电商商城源码(支持多种支付方式+多语言+多货币+快速部署)

随着跨境电商的繁荣发展,支付方式的多样性已成为消费者和电商平台关注的焦点。本文将介绍一款支持多种支付方式的跨境电商源码,以提升用户的购物体验和平台的竞争力。 一、背景概述 近年来,跨境电商市场呈现出迅速增长的趋势。然而&#xff0…

建设城市展厅用的多媒体互动装置有哪些作用?

随着科技的迅速进步,智慧城市这一概念已经逐渐从理论走向现实,而智慧城市展厅则成为了集中展示智慧城市理念、技术和规划的重要场所,在其中发挥着重要的作用,并且还在建设这些展厅的过程中,应用了大量的多媒体互动装置…

fpmarkets总结的交易员5个阶段,您处在第几级

交易员的发展是一个逐步上升的阶梯式过程。总体上,这个过程被fpmarkets总结的五个阶段: 第一阶段,新手期。在这个阶段,新手交易者会接触到大量的市场工具和信息。主要目标是学习如何在市场中交易,同时避免产生亏损。许…

MySQL:至少参与xxx参与的全部事件(二)

MySQL:至少参与xxx参与的全部事件(二) – WhiteNights Site 标签:MySQL 本来不难的,结果实验课上又没能当场做出来。还是回到宿舍复盘才看到问题所在,令人感慨。 头歌例题 仔细审题 任务描述 创建一个名…

数据结构(超详细讲解!!)第二十节 数组

1.定义 1.概念 相同类型的数据元素的集合。 记作:A(A0,A1,…,Am-1) 二维数组可看作是每个数据元素都是相同类型的一维数组的一维数组。多维数组依此类推。 二维数组是数据元素为线性表的线性表。 A(A0,A1,……,An-1) 其中…

docker 下安装mysql8.0

在docker中查询mysql镜像 PS C:\Users\admin> docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation……

每个外贸人都有一颗不甘的心

是不是每个三十多岁的外贸人都有一颗不安现状的心?总是想挑战一下自己的极限或者是拓宽一下自己未知的领域? 最近遇到一个经常去各个国家参加展会来获取客户的外贸人,他的第一话题不是自己去展会的效果如何,也不是说自己现在做的…

更好看更好听的百元真无线耳机,BarbetSound Buds T60上手

现在的真无线蓝牙耳机已经很成熟了,选择也特别多,大家很容易找到适合自己的款式。我比较关注耳机在续航、音质等方面的表现,最近用的是来自BarbetSound的Buds T60,这款耳机轻巧便携,而且音质非常好,性价比十…

【LLM】预训练||两句话明白儿的底层原理

预训练鼻祖阶段:目前认为是Bert时期 从字面上看,预训练模型(pre-training model)是先通过一批语料进行训练模型,然后在这个初步训练好的模型基础上,再继续训练或者另作他用。这样的理解基本上是对的&#…

学习笔记|两组率卡方检验和Fisher确切法|适用条件|规范表达|《小白爱上SPSS》课程:SPSS第十五讲 | 两组率卡方检验和Fisher确切法怎么做?

目录 学习目的软件版本原始文档两组率卡方检验和Fisher确切法适用条件简述一、实战案例读数据: 二、统计策略三、SPSS操作四、结果解读第一,分组统计描述结果第二,卡方检验。 五、规范报告1、规范表格2、规范文字 学习目的 SPSS第十五讲 | 两…

Scala语言用Selenium库写一个爬虫模版

首先,我将使用Scala编写一个使用Selenium库下载yuanfudao内容的下载器程序。 然后我们需要在项目的build.sbt文件中添加selenium的依赖项。以下是添加Selenium依赖项的代码: libraryDependencies "org.openqa.selenium" % "selenium-ja…

Web APIs——节点操作

1、DOM节点 DOM节点:DOM树里每一个内容都称之为节点 节点类型: 元素节点 所有的标签 比如body、div属性节点 所有的属性 比如 href文本节点 所有的文本其他 2、查找节点 关闭二维码案例: 点击关闭按钮,关闭的是二维码的盒子&#…

Maven系列第10篇:设计你自己的maven插件【高手必备】

Maven默认提供了很多插件,功能也非常强大,但是如果我们想自己开发一些插件,比如自定义一款自动打包并且发布到服务器然后重启服务器的插件;或者定义一款插件自动打包自动运行打包好的构件。各种好玩的东西只要你能想到&#xff0c…

Python中表单的处理

目录 1. 表单的基本概念 2. 使用Flask处理表单 3. 表单验证 4. 数据存储 5. 使用数据库存储表单数据 6. 安全性考虑 总结 当我们谈论Web开发时,表单处理是一个不可避免的话题。表单是Web应用程序中用户输入数据的界面,而处理这些数据则是后端开发…

从零开始制作一个割草机器人

项目背景 为啥要做一个割草机器人呢?(个人因素:我梦想就是做一款人形机器人保护人类,解放人类) 基础准备:我们公司本身做过高精度,基于高精度的技术扩展到农机自动化驾驶。目前可以实现AB线拖…

【qemu逃逸】BlizzardCTF2017-strng

前言 虚拟机用户名:ubuntu 密码:passw0rd 一道入门题,看下启动脚本: ./qemu-system-x86_64 \-m 1G \-device strng \-hda my-disk.img \-hdb my-seed.img \-nographic \-L pc-bios/ \-enable-kvm \-device e1000,netdevnet0 \…

微信自动回复有什么好处?怎么设置?

微信自动回复有什么好处? 首先,它可以帮助我们节省时间和精力。当我们无法立即回复消息时,自动回复可以及时告知对方我们的状况,避免对方的焦虑和不便。 其次,自动回复可以增强沟通效率。无论是工作还是个人生活中&a…

sqlsugar查询数据库下的所有表,批量修改表名字

查询数据库中的所有表 using SqlSugar;namespace 批量修改数据库表名 {internal class Program{static void Main(string[] args){SqlSugarClient sqlSugarClient new SqlSugarClient(new ConnectionConfig(){ConnectionString "Data Source(localdb)\\MSSQLLocalDB;In…

SSD-1B:Segmind的加速稳定扩散模型

Segmind 稳定扩散模型 (SSD-1B) 是稳定扩散 XL (SDXL) 缩小 50% 的精简版本,可提供 60% 的加速,同时保持高质量的文本到图像生成功能。 它已经过各种数据集的训练,包括 Grit 和 Midjourney scrap 数据,以增强其根据文本提示创建各…

Find My卡片|苹果Find My技术与卡片结合,智能防丢,全球定位

钱包是许多人正常生活必备的物品,如果丢失钱包,不仅是钱的损失,还因为丢失了证件和银行卡,导致我们需要话费大量时间去补办,造成生活的不便。如今防丢卡片的出现将减少这类问题的发生。 在智能化加持下,防丢…