init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
--[[
|
||||
@module 485_uart
|
||||
@summary 485串口功能模块
|
||||
@version 1.0
|
||||
@date 2025.09.23
|
||||
@author 魏健强
|
||||
@usage
|
||||
本demo演示的核心功能为:
|
||||
1.开启串口,配置波特率等参数;
|
||||
2.设置接收回调函数
|
||||
3.定时向串口发送数据
|
||||
|
||||
硬件环境说明:
|
||||
- V1.2开发板:控制485接收和发送的使能脚为GPIO25
|
||||
- V1.3开发板:控制485接收和发送的使能脚为GPIO24(默认)
|
||||
]]
|
||||
|
||||
-- 根据硬件环境配置485使能脚
|
||||
local uart485Pin = 24 -- 默认值
|
||||
|
||||
if HARDWARE_ENV == "DEV_BOARD_V1.2" then
|
||||
uart485Pin = 25 -- V1.2开发板使用GPIO25
|
||||
elseif HARDWARE_ENV == "DEV_BOARD_V1.3" then
|
||||
uart485Pin = 24 -- V1.3开发板使用GPIO24
|
||||
end
|
||||
|
||||
local uartid = 1 -- 根据实际设备选取不同的uartid
|
||||
|
||||
gpio.setup(1, 1) --打开电源(开发板485供电脚是gpio1,用开发板测试需要开机初始化拉高gpio1)
|
||||
gpio.setup(23, 1) --打开上拉电源
|
||||
|
||||
local function uart_send()
|
||||
-- 循环两秒向串口发一次数据
|
||||
while true do
|
||||
sys.wait(2000)
|
||||
uart.write(uartid, "test data.")
|
||||
end
|
||||
end
|
||||
|
||||
local function uart_send_cb(id)
|
||||
log.info("uart", id , "数据发送完成回调")
|
||||
end
|
||||
|
||||
|
||||
local function uart_cb(id, len)
|
||||
local s = ""
|
||||
repeat
|
||||
s = uart.read(id, 128) -- 读取缓冲区中的数据,这里设置的一次读最多128字节
|
||||
if #s > 0 then -- #s 是取字符串的长度
|
||||
-- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
|
||||
log.info("uart", "receive", id, #s, s)
|
||||
-- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
|
||||
end
|
||||
until s == ""
|
||||
end
|
||||
|
||||
--初始化
|
||||
uart.setup(uartid, 9600, 8, 1, uart.NONE, uart.LSB, 1024, uart485Pin, 0, 20000)
|
||||
|
||||
-- 收取数据会触发回调, 这里的"receive" 是固定值
|
||||
uart.on(uartid, "receive", uart_cb)
|
||||
|
||||
-- 发送数据完成会触发回调, 这里的"sent" 是固定值
|
||||
uart.on(uartid, "sent", uart_send_cb)
|
||||
|
||||
sys.taskInit(uart_send)
|
||||
@@ -0,0 +1,121 @@
|
||||
--[[
|
||||
@module high_volume_uart
|
||||
@summary 串口大数据收发功能模块
|
||||
@version 1.0
|
||||
@date 2025.09.23
|
||||
@author 魏健强
|
||||
@usage
|
||||
本demo演示的核心功能为:
|
||||
1.开启串口,配置波特率等参数;
|
||||
2.设置接收回调函数
|
||||
3.定时向串口发送数据
|
||||
4.使用zbuff的方式收发数据
|
||||
]]
|
||||
local uartid = 1 -- 根据实际设备选取不同的uartid
|
||||
|
||||
uart_mode_zbuff = true -- 是否使用zbuff方式收发数据
|
||||
local sendres = 0 -- 发送结果标志位
|
||||
local function uart_send_cb(id)
|
||||
sendres = 1 -- 标志位置1,表示发送完成
|
||||
log.info("uart", id, "数据发送完成回调")
|
||||
end
|
||||
|
||||
if uart_mode_zbuff then
|
||||
local rxbuff = zbuff.create(10240) -- 接收数据的zbuff
|
||||
local txbuff = zbuff.create(300000, 0x01) -- 发送数据的zbuff
|
||||
txbuff:seek(299999) -- 设置txbuff数据长度
|
||||
log.info("uart", "txbuff used", txbuff:used()) -- 查看txbuff已用长度
|
||||
local function uart_send()
|
||||
local tx_start = 0 -- 发送数据起始位置
|
||||
local tx_lenmax = 102400 -- 每次最大发送数据长度
|
||||
-- 判断已发送数据长度
|
||||
while true do
|
||||
local tx_len = tx_lenmax
|
||||
-- 发送数据
|
||||
sendres = 0 -- 发送结果标志位置0,表示正在发送
|
||||
if txbuff:used() - tx_start <= tx_lenmax then -- 剩余数据长度小于每次最大发送长度
|
||||
tx_len = txbuff:used() - tx_start -- 计算本次发送数据长度
|
||||
end
|
||||
log.info("uart", "开始发送数据", "tx_start", tx_start, "tx_len", tx_len)
|
||||
uart.tx(uartid, txbuff, tx_start, tx_len)
|
||||
while sendres == 0 do -- 等待发送完成
|
||||
sys.wait(100)
|
||||
end
|
||||
tx_start = tx_start + tx_len -- 更新发送起始位置
|
||||
if tx_start >= txbuff:used() then
|
||||
break
|
||||
end
|
||||
log.info("uart", "数据发送调用完成")
|
||||
end
|
||||
end
|
||||
|
||||
local function uart_cb(id, len) -- 串口接收数据回调函数
|
||||
while 1 do
|
||||
log.info("uart", "缓冲区", uart.rxSize(id))
|
||||
local len = uart.rx(id, rxbuff)
|
||||
if len <= 0 then
|
||||
break
|
||||
end
|
||||
log.info("uart", "receive", id, rxbuff:used(), rxbuff:toStr(0,rxbuff:used()))
|
||||
rxbuff:seek(0)
|
||||
end
|
||||
end
|
||||
|
||||
-- 初始化
|
||||
uart.setup(uartid, -- 串口id
|
||||
115200, -- 波特率
|
||||
8, -- 数据位
|
||||
1, -- 停止位
|
||||
uart.NONE, -- 校验位,可选 uart.None/uart.Even/uart.Odd。默认 uart.None 无校验
|
||||
uart.LSB, -- 大小端,默认小端 uart.LSB, 可选 uart.MSB
|
||||
10240 -- 缓冲区大小,默认值1024,接收大数据时需要根据数据大小增大缓冲区
|
||||
)
|
||||
|
||||
-- 收取数据会触发回调, 这里的"receive" 是固定值
|
||||
uart.on(uartid, "receive", uart_cb)
|
||||
|
||||
-- 发送数据完成会触发回调, 这里的"sent" 是固定值
|
||||
uart.on(uartid, "sent", uart_send_cb)
|
||||
|
||||
sys.taskInit(uart_send)
|
||||
else
|
||||
local function uart_send()
|
||||
-- 循环两秒向串口发一次数据
|
||||
while true do
|
||||
sys.wait(2000)
|
||||
uart.write(uartid, "test data.")
|
||||
end
|
||||
end
|
||||
|
||||
local function uart_cb(id, len)
|
||||
local s = ""
|
||||
repeat
|
||||
s = uart.read(id, 10240) -- 一次性读出所有缓冲区中的数据,避免分包
|
||||
if #s > 0 then -- #s 是取字符串的长度
|
||||
-- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
|
||||
log.info("uart", "receive", id, #s, s)
|
||||
-- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
|
||||
end
|
||||
until s == ""
|
||||
end
|
||||
|
||||
-- 初始化
|
||||
uart.setup(uartid, -- 串口id
|
||||
115200, -- 波特率
|
||||
8, -- 数据位
|
||||
1, -- 停止位
|
||||
uart.NONE, -- 校验位,可选 uart.None/uart.Even/uart.Odd。默认 uart.None 无校验
|
||||
uart.LSB, -- 大小端,默认小端 uart.LSB, 可选 uart.MSB
|
||||
10240 -- 缓冲区大小,默认值1024,接收大数据时需要根据数据大小增大缓冲区
|
||||
)
|
||||
|
||||
-- 收取数据会触发回调, 这里的"receive" 是固定值
|
||||
uart.on(uartid, "receive", uart_cb)
|
||||
|
||||
-- 发送数据完成会触发回调, 这里的"sent" 是固定值
|
||||
uart.on(uartid, "sent", uart_send_cb)
|
||||
|
||||
sys.taskInit(uart_send)
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
--[[
|
||||
@module main
|
||||
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
|
||||
@version 1.0
|
||||
@date 2025.09.23
|
||||
@author 魏健强
|
||||
@usage
|
||||
本demo演示的核心功能为:
|
||||
演示uart串口功能的使用:
|
||||
1. 简易串口,小数据字符串收发
|
||||
2. 大数据收发串口
|
||||
3. 485串口
|
||||
4. 多串口
|
||||
5. USB虚拟串口
|
||||
]]
|
||||
--[[
|
||||
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
|
||||
PROJECT:项目名,ascii string类型
|
||||
可以随便定义,只要不使用,就行
|
||||
VERSION:项目版本号,ascii string类型
|
||||
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
|
||||
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
|
||||
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为999
|
||||
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
|
||||
]]-- Luatools需要PROJECT和VERSION这两个信息
|
||||
PROJECT = "uart"
|
||||
VERSION = "001.999.000"
|
||||
|
||||
|
||||
-- 在日志中打印项目名和项目版本号
|
||||
log.info("main", PROJECT, VERSION)
|
||||
|
||||
-- 硬件环境配置说明
|
||||
-- 本Demo支持两种硬件环境,请根据实际使用情况修改HARDWARE_ENV变量:
|
||||
-- "DEV_BOARD_V1.3" - V1.3开发板(默认)
|
||||
-- 控制485接收和发送的使能脚:GPIO24
|
||||
-- "DEV_BOARD_V1.2" - V1.2开发板
|
||||
-- 控制485接收和发送的使能脚:GPIO25
|
||||
HARDWARE_ENV = "DEV_BOARD_V1.3" -- 修改此值适配不同开发板版本:"DEV_BOARD_V1.3"=V1.3开发板, "DEV_BOARD_V1.2"=V1.2开发板
|
||||
|
||||
|
||||
|
||||
-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
|
||||
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
|
||||
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
|
||||
-- 启动errDump日志存储并且上传功能,600秒上传一次
|
||||
-- if errDump then
|
||||
-- errDump.config(true, 600)
|
||||
-- end
|
||||
|
||||
|
||||
-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
|
||||
-- 可以使用合宙的iot.openluat.com平台进行远程升级
|
||||
-- 也可以使用客户自己搭建的平台进行远程升级
|
||||
-- 远程升级的详细用法,可以参考fota的demo进行使用
|
||||
|
||||
|
||||
-- 启动一个循环定时器
|
||||
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
|
||||
-- 方便分析内存使用是否有异常
|
||||
-- sys.timerLoopStart(function()
|
||||
-- log.info("mem.lua", rtos.meminfo())
|
||||
-- log.info("mem.sys", rtos.meminfo("sys"))
|
||||
-- end, 3000)
|
||||
|
||||
|
||||
|
||||
-- uart功能模块
|
||||
require "uart_manger"
|
||||
|
||||
-- 用户代码已结束---------------------------------------------
|
||||
-- 结尾总是这一句
|
||||
sys.run()
|
||||
-- sys.run()之后后面不要加任何语句!!!!!
|
||||
@@ -0,0 +1,73 @@
|
||||
--[[
|
||||
@module multiple_uart
|
||||
@summary 多串口功能模块
|
||||
@version 1.0
|
||||
@date 2025.09.23
|
||||
@author 魏健强
|
||||
@usage
|
||||
本demo演示的核心功能为:
|
||||
1.开启串口,配置波特率等参数;
|
||||
2.设置接收回调函数
|
||||
3.定时向串口发送数据
|
||||
]]
|
||||
-- 根据实际设备选取不同的uartid
|
||||
local uartid1 = 1 -- 第一个串口id
|
||||
local uartid2 = 2 -- 第二个串口id
|
||||
--local uartid2 = 3 --第三个串口id(Air780EGH用第三个串口,UART2已经用作通信主芯片和GNSS芯片之间的通信用)
|
||||
|
||||
local function uart_send()
|
||||
-- 循环两秒分别向两个串口发一次数据
|
||||
while true do
|
||||
sys.wait(2000)
|
||||
uart.write(uartid1, "uart1 test data.")
|
||||
uart.write(uartid2, "uart2 test data.")
|
||||
end
|
||||
end
|
||||
|
||||
local function uart_send_cb(id)
|
||||
log.info("uart", id , "数据发送完成回调")
|
||||
end
|
||||
|
||||
local function uart_cb(id, len)
|
||||
local s = ""
|
||||
repeat
|
||||
s = uart.read(id, 128) -- 读取缓冲区中的数据,这里设置的一次读最多128字节
|
||||
if #s > 0 then -- #s 是取字符串的长度
|
||||
-- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
|
||||
log.info("uart", "receive", id, #s, s)
|
||||
-- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
|
||||
end
|
||||
until s == ""
|
||||
end
|
||||
|
||||
-- 初始化第一个串口
|
||||
uart.setup(
|
||||
uartid1,--串口id
|
||||
115200,--波特率
|
||||
8,--数据位
|
||||
1--停止位
|
||||
)
|
||||
|
||||
-- 初始化第一个串口
|
||||
uart.setup(
|
||||
uartid2,--串口id
|
||||
115200,--波特率
|
||||
8,--数据位
|
||||
1--停止位
|
||||
)
|
||||
|
||||
-- 第一个串口接收数据回调函数
|
||||
-- 收取数据会触发回调, 这里的"receive" 是固定值
|
||||
uart.on(uartid1, "receive", uart_cb)
|
||||
|
||||
-- 第二个串口接收数据回调函数
|
||||
-- 收取数据会触发回调, 这里的"receive" 是固定值
|
||||
uart.on(uartid2, "receive", uart_cb)
|
||||
|
||||
-- 发送数据完成会触发回调, 这里的"sent" 是固定值
|
||||
uart.on(uartid1, "sent", uart_send_cb)
|
||||
|
||||
-- 发送数据完成会触发回调, 这里的"sent" 是固定值
|
||||
uart.on(uartid2, "sent", uart_send_cb)
|
||||
|
||||
sys.taskInit(uart_send)
|
||||
@@ -0,0 +1,182 @@
|
||||
## 一、演示模块概述
|
||||
|
||||
1、main.lua:主程序入口;
|
||||
|
||||
2、uart_manger:串口功能管理模块,用于管理以下五种串口应用场景功能;
|
||||
|
||||
3、simple_uart:简易串口,小数据字符串收发;
|
||||
|
||||
4、high_volume_uart:大数据收发串口;
|
||||
|
||||
5、485_uart:485串口;
|
||||
|
||||
6、multiple_uart:多串口;
|
||||
|
||||
7、usb_uart:USB虚拟串口;
|
||||
|
||||
8、uart_mux:动态切换串口引脚复用
|
||||
|
||||
## 二、演示功能概述
|
||||
|
||||
使用Air780EPM开发板测试串口相关功能。
|
||||
|
||||
## 三、演示硬件环境
|
||||
|
||||
### 3.1 硬件环境说明
|
||||
|
||||
本Demo支持两种硬件环境,请根据实际使用的开发板版本选择对应的配置:
|
||||
|
||||
| 硬件环境 | HARDWARE_ENV值 | 控制485接收和发送的使能脚 |
|
||||
|---------|---------------|----------|
|
||||
| V1.3开发板 | "DEV_BOARD_V1.3" | GPIO24(默认) |
|
||||
| V1.2开发板 | "DEV_BOARD_V1.2" | GPIO25 |
|
||||
|
||||
**配置方法:** 在`main.lua`中修改`HARDWARE_ENV`变量的值即可切换硬件环境。
|
||||
|
||||
#### 3.1.1 V1.3开发板(DEV_BOARD_V1.3,默认)
|
||||
|
||||
**配置说明**
|
||||
|
||||
在`main.lua`中设置:
|
||||
```lua
|
||||
HARDWARE_ENV = "DEV_BOARD_V1.3"
|
||||
```
|
||||
|
||||
485_uart驱动会自动完成以下操作:
|
||||
- 使用 **GPIO24** 作为485使能脚
|
||||
|
||||
#### 3.1.2 V1.2开发板(DEV_BOARD_V1.2)
|
||||
|
||||
**配置说明**
|
||||
|
||||
在`main.lua`中设置:
|
||||
```lua
|
||||
HARDWARE_ENV = "DEV_BOARD_V1.2"
|
||||
```
|
||||
|
||||
485_uart驱动会自动完成以下操作:
|
||||
- 使用 **GPIO25** 作为485使能脚
|
||||
|
||||
### 3.2 硬件清单和接线说明
|
||||
|
||||
下面以Air780EPM V1.3开发板为例进行演示:
|
||||
|
||||

|
||||
|
||||
1、Air780EPM V1.3版本开发板一块:
|
||||
|
||||
2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air780EPM V1.3版本开发板和数据线的硬件接线方式为:
|
||||
|
||||
- Air780EPM V1.3版本开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
|
||||
|
||||
- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
|
||||
|
||||
- USB转串口数据线,一般来说,白线连接开发板的UART_TX,绿线连接开发板的UART_RX,黑线连接核心板的GND,另外一端连接电脑USB口;
|
||||
|
||||
3、不同功能测试时的接线说明:
|
||||
|
||||
- 单串口,simple_uart和high_volume_uart 接串口1
|
||||
|
||||
| Air780EPM开发板 | MCU或者串口板 |
|
||||
| ----------------- | ------------- |
|
||||
| UART1_TXD | UART_RXD |
|
||||
| UART1_RXD | UART_TXD |
|
||||
| GND | GND |
|
||||
|
||||

|
||||
|
||||
- 485串口,485_uart 接485-A,B
|
||||
|
||||
| Air780EPM开发板 | MCU或者串口板 |
|
||||
| ----------------- | ------------- |
|
||||
| 485-A | 485-A |
|
||||
| 485-B | 485-B |
|
||||
| GND | GND |
|
||||
|
||||
|
||||

|
||||
|
||||
- 多串口,multiple_uart 接串口1,串口2
|
||||
|
||||
串口2:
|
||||
|
||||
| Air780EPM开发板 | MCU或者串口板 |
|
||||
| ----------------- | ------------- |
|
||||
| UART2_TX | UART_RXD |
|
||||
| UART2_RX | UART_TXD |
|
||||
| GND | GND |
|
||||
|
||||
串口1:
|
||||
|
||||
| Air780EPM开发板 | MCU或者串口板 |
|
||||
| ----------------- | ------------- |
|
||||
| UART1_TXD | UART_RXD |
|
||||
| UART1_RXD | UART_TXD |
|
||||
| GND | GND |
|
||||
|
||||

|
||||
|
||||
- 串口引脚动态复用
|
||||
|
||||
第一组串口2:
|
||||
|
||||
| Air780EPM开发板 | MCU或者串口板 |
|
||||
| ----------------- | ------------- |
|
||||
| UART2_TX | UART_RXD |
|
||||
| UART2_RX | UART_TXD |
|
||||
| GND | GND |
|
||||
|
||||
第二组串口2:
|
||||
|
||||
| Air780EPM开发板 | MCU或者串口板 |
|
||||
| ----------------- | ------------- |
|
||||
| SPI_CLK | UART_RXD |
|
||||
| SPI_MISO | UART_TXD |
|
||||
| GND | GND |
|
||||
|
||||

|
||||
|
||||
- usb虚拟串口,usb_uart 接usb
|
||||
|
||||
首先通过带有 DM、DP 的 USB 数据线两端连接 模块 和 Windows10 或者 Windows11 系统的电脑。
|
||||
然后将模块开机,就可以从电脑的设备管理器中看到端口处多出来 3 个 USB 端口。
|
||||
找到"USB\VID_19D1&PID_0001&MI_06\7&17910EBA&0&0006"就是用于软件控制串口传输的 USB 虚拟串口。
|
||||
|
||||

|
||||
|
||||
## 四、演示软件环境
|
||||
|
||||
1、Luatools下载调试工具
|
||||
|
||||
2、[Air780EPM V2016版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)(理论上,最新发布的固件都可以)
|
||||
|
||||
3、PC端的串口工具,例如SSCOM、LLCOM等都可以;
|
||||
|
||||
## 五、演示核心步骤
|
||||
|
||||
1、搭建好硬件环境
|
||||
|
||||
2、uart_manger.lua 中加载需要用的功能模块,五个功能模块同时只能选择一个使用,其他的注释。
|
||||
|
||||
3、Luatools 烧录内核固件和修改后的 demo 脚本代码
|
||||
|
||||
4、烧录成功后,代码会自动运行,查看打印日志,如果正常运行,会打印串口初始化和串口收发数据等相关信息。
|
||||
|
||||
5、simple_uart:
|
||||

|
||||
|
||||
6、high_volume_uart:
|
||||

|
||||
|
||||
7、multiple_uart
|
||||

|
||||
|
||||
8、usb_uart:
|
||||

|
||||
|
||||
9、485_uart:
|
||||

|
||||

|
||||
|
||||
10、uart_mux:
|
||||

|
||||
@@ -0,0 +1,52 @@
|
||||
--[[
|
||||
@module simple_uart
|
||||
@summary 简易串口功能模块
|
||||
@version 1.0
|
||||
@date 2025.09.23
|
||||
@author 魏健强
|
||||
@usage
|
||||
本demo演示的核心功能为:
|
||||
1.开启串口,配置波特率等参数;
|
||||
2.设置接收回调函数
|
||||
3.定时向串口发送数据
|
||||
]]
|
||||
local uartid = 1 -- 根据实际设备选取不同的uartid
|
||||
|
||||
local function uart_send()
|
||||
-- 循环两秒向串口发一次数据
|
||||
while true do
|
||||
sys.wait(2000)
|
||||
uart.write(uartid, "test data.")
|
||||
end
|
||||
end
|
||||
|
||||
local function uart_send_cb(id)
|
||||
log.info("uart", id , "数据发送完成回调")
|
||||
end
|
||||
|
||||
local function uart_cb(id, len)
|
||||
local s = ""
|
||||
repeat
|
||||
s = uart.read(id, 128) -- 读取缓冲区中的数据,这里设置的一次读最多128字节
|
||||
if #s > 0 then -- #s 是取字符串的长度
|
||||
-- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
|
||||
log.info("uart", "receive", id, #s, s)
|
||||
-- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
|
||||
end
|
||||
until s == ""
|
||||
end
|
||||
--初始化
|
||||
uart.setup(
|
||||
uartid,--串口id
|
||||
115200,--波特率
|
||||
8,--数据位
|
||||
1--停止位
|
||||
)
|
||||
|
||||
-- 收取数据会触发回调, 这里的"receive" 是固定值
|
||||
uart.on(uartid, "receive", uart_cb)
|
||||
|
||||
-- 发送数据完成会触发回调, 这里的"sent" 是固定值
|
||||
uart.on(uartid, "sent", uart_send_cb)
|
||||
|
||||
sys.taskInit(uart_send)
|
||||
@@ -0,0 +1,32 @@
|
||||
--[[
|
||||
@module uart_manger
|
||||
@summary 串口功能管理模块
|
||||
@version 1.0
|
||||
@date 2025.09.23
|
||||
@author 魏健强
|
||||
@usage
|
||||
本模块为串口功能管理模块,核心业务逻辑为:根据项目需求,选择并且配置合适的串口功能
|
||||
1、simple_uart:简易串口,小数据字符串收发;
|
||||
2、high_volume_uart:大数据收发串口;
|
||||
3、485_uart:485串口;
|
||||
4、multiple_uart:多串口;
|
||||
5、usb_uart:USB虚拟串口;
|
||||
]]
|
||||
-- 根据自己的项目需求,只需要require以下五种中的一种即可;
|
||||
-- 简易串口,小数据字符串收发
|
||||
require "simple_uart"
|
||||
|
||||
-- 大数据收发串口
|
||||
-- require "high_volume_uart"
|
||||
|
||||
-- 485串口
|
||||
-- require "485_uart"
|
||||
|
||||
-- 多串口
|
||||
-- require "multiple_uart"
|
||||
|
||||
-- USB虚拟串口
|
||||
-- require "usb_uart"
|
||||
|
||||
-- 动态切换串口引脚复用
|
||||
-- require "uart_mux"
|
||||
@@ -0,0 +1,68 @@
|
||||
--[[
|
||||
@module uart_mux
|
||||
@summary 串口引脚动态复用功能模块
|
||||
@version 1.0
|
||||
@date 2025.09.23
|
||||
@author 魏健强
|
||||
@usage
|
||||
本demo演示的核心功能为:
|
||||
1.开启串口,配置波特率等参数,串口2引脚配置默认为模块pin28,pin29;
|
||||
2.设置接收和发送回调函数;
|
||||
3.一段时间后切换串口引脚复用,将串口2引脚从pin28,pin29切换到pin84,pin86;
|
||||
]]
|
||||
local uartid = 2 -- 根据实际设备选取不同的uartid
|
||||
|
||||
local function uart_send()
|
||||
-- 循环两秒向串口发一次数据
|
||||
while true do
|
||||
sys.wait(2000)
|
||||
uart.write(uartid, "test data.")
|
||||
end
|
||||
end
|
||||
|
||||
local function uart_send_cb(id)
|
||||
log.info("uart", id , "数据发送完成回调")
|
||||
end
|
||||
|
||||
local function uart_cb(id, len)
|
||||
local s = ""
|
||||
repeat
|
||||
s = uart.read(id, 128) -- 读取缓冲区中的数据,这里设置的一次读最多128字节
|
||||
if #s > 0 then -- #s 是取字符串的长度
|
||||
-- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
|
||||
log.info("uart", "receive", id, #s, s)
|
||||
-- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
|
||||
end
|
||||
until s == ""
|
||||
end
|
||||
|
||||
local function uart_io_setup()
|
||||
sys.wait(15000)
|
||||
log.info("uart", "重新配置uart2到新管脚")
|
||||
uart.close(2)
|
||||
pins.setup(28, "GPIO12") -- 把原有的uart改成其他功能, 或者gpio
|
||||
pins.setup(29, "GPIO13") -- 把原有的uart改成其他功能, 或者gpio
|
||||
gpio.close(12)
|
||||
gpio.close(13)
|
||||
pins.setup(84, "UART2_RX") -- 设置新管脚为uart2
|
||||
pins.setup(86, "UART2_TX") -- 设置新管脚为uart2
|
||||
uart.setup(uartid,115200,8,1) -- 重新初始化串口
|
||||
log.info("uart", "uart2重新配置完成")
|
||||
end
|
||||
|
||||
--初始化
|
||||
uart.setup(
|
||||
uartid,--串口id
|
||||
115200,--波特率
|
||||
8,--数据位
|
||||
1--停止位
|
||||
)
|
||||
|
||||
-- 收取数据会触发回调, 这里的"receive" 是固定值
|
||||
uart.on(uartid, "receive", uart_cb)
|
||||
|
||||
-- 发送数据完成会触发回调, 这里的"sent" 是固定值
|
||||
uart.on(uartid, "sent", uart_send_cb)
|
||||
|
||||
sys.taskInit(uart_send)
|
||||
sys.taskInit(uart_io_setup)
|
||||
@@ -0,0 +1,63 @@
|
||||
--[[
|
||||
@module usb_uart
|
||||
@summary USB虚拟串口功能模块
|
||||
@version 1.0
|
||||
@date 2025.09.23
|
||||
@author 魏健强
|
||||
@usage
|
||||
本demo演示的核心功能为:
|
||||
1.开启串口,配置波特率等参数;
|
||||
2.设置接收回调函数
|
||||
3.定时向串口发送数据
|
||||
]]
|
||||
local uartid = uart.VUART_0 -- 使用USB虚拟串口,固定id
|
||||
|
||||
local function uart_send()
|
||||
local data =
|
||||
{
|
||||
host = "abcdefg.com",
|
||||
port = "1883",
|
||||
clientID = "c88885",
|
||||
username = "user",
|
||||
password = "123456",
|
||||
ca_self = {ssl=false},
|
||||
}
|
||||
local jsondata = json.encode(data)
|
||||
-- 循环每两秒向串口发一次数据
|
||||
while true do
|
||||
sys.wait(2000)
|
||||
uart.write(uartid, jsondata)
|
||||
end
|
||||
end
|
||||
|
||||
local function uart_send_cb(id)
|
||||
log.info("uart", id , "数据发送完成回调")
|
||||
end
|
||||
|
||||
local function uart_cb(id, len)
|
||||
local s = ""
|
||||
repeat
|
||||
s = uart.read(id, 128) -- 读取缓冲区中的数据,这里设置的一次读最多128字节
|
||||
if #s > 0 then -- #s 是取字符串的长度
|
||||
-- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
|
||||
log.info("uart", "receive", id, #s, s)
|
||||
-- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
|
||||
end
|
||||
until s == ""
|
||||
end
|
||||
|
||||
--初始化
|
||||
uart.setup(
|
||||
uartid,--串口id
|
||||
115200,--波特率
|
||||
8,--数据位
|
||||
1--停止位
|
||||
)
|
||||
|
||||
-- 收取数据会触发回调, 这里的"receive" 是固定值
|
||||
uart.on(uartid, "receive", uart_cb)
|
||||
|
||||
-- 发送数据完成会触发回调, 这里的"sent" 是固定值
|
||||
uart.on(uartid, "sent", uart_send_cb)
|
||||
|
||||
sys.taskInit(uart_send)
|
||||
Reference in New Issue
Block a user