air101#
本章介绍LuatOS的uart库使用方式
简介#
UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。
UART 串口的特点是将数据一位一位地顺序传送,只要 2 根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用 UART 串口通信的端口,这些参数必须匹配,否则通信将无法正常完成。
查阅Air101_MCU设计手册V1.2.pdf可知Air101共有6路UART,UART0固定为下载和日志口
我们使用UART1通过TTL转USB模块与PC连接,实现PC和Air101传递数据
硬件准备#
Air101开发板
USB转TTL模块
接线示意
U1_RX/GPIO23 ------ TX
Air101 U1_TX/GPIO22 ------ RX USB-TTL->PC
GND ------ GND
软件部分#
接口文档可参考:uart库
uart发送与接收数据时可以直接传递string类型数据,也可以传递zbuff对象,下面会分别演示两种方式
创建两个zbuff数组#
如果不使用zbuff处理数据的话就跳过这一步
代码如下
-- 创建1KB的发送缓冲区
sendBuff = zbuff.create(1024)
-- 创建1KB的接收缓冲区
receiveBuff = zbuff.create(1024)
-- 向发送缓冲区写入数据
sendBuff:write("Hi,I am Air101\n")
-- 将发送缓冲区的指针重新移到开头
sendBuff:seek(0)
初始化uart#
初始化UART1,波特率为921600,8位数据位,1位停止位,无校验
代码如下
uart.setup(1, 921600, 8, 1, uart.None)
注册串口事件回调#
给UART1注册一个接收事件回调,在Air101 UART1接收到数据的时候进行读取和打印
接收string类型的数据#
代码如下
uart.on(1, "receive", function(id, len)
local data = uart.read(id, len)
log.info(PROJECT .. ".receive-" .. id, data)
end)
使用zbuff接收数据#
代码如下
uart.on(1, "receive", function(id, len)
-- 将数据读取到接收缓冲区
uart.read(id, len, receiveBuff)
-- 将接收缓冲区的指针重新移到开头
receiveBuff:seek(0)
-- 从接收缓冲区中读取数据
local data = receiveBuff:read(len)
-- 将接收缓冲区的指针重新移到开头
receiveBuff:seek(0)
log.info(PROJECT .. ".receive-" .. id, data)
end)
新建一个循环定时器向UART1发送数据#
发送string类型的数据#
代码如下
sys.timerLoopStart(function()
uart.write(1, "Hi,I am Air101\n")
end, 2000)
使用zbuff发送数据#
代码如下
sys.timerLoopStart(function()
uart.write(1, sendBuff, 15)
end, 2000)
完整代码#
PROJECT = "uart"
VERSION = "1.0.0"
sys = require("sys")
USE_ZBUFF = false
if USE_ZBUFF == true then
-- 创建1KB的发送缓冲区
sendBuff = zbuff.create(1024)
-- 创建1KB的接收缓冲区
receiveBuff = zbuff.create(1024)
-- 向发送缓冲区写入数据
sendBuff:write("Hi,I am Air101\n")
-- 将发送缓冲区的指针重新移到开头
sendBuff:seek(0)
end
uart.setup(1, 921600, 8, 1, uart.None)
if USE_ZBUFF == true then
uart.on(1, "receive", function(id, len)
-- 将数据读取到接收缓冲区
uart.read(id, len, receiveBuff)
-- 将接收缓冲区的指针重新移到开头
receiveBuff:seek(0)
-- 从接收缓冲区中读取数据
local data = receiveBuff:read(len)
-- 将接收缓冲区的指针重新移到开头
receiveBuff:seek(0)
log.info(PROJECT .. ".receive-" .. id, data)
end)
sys.timerLoopStart(function()
uart.write(1, sendBuff, 15)
end, 2000)
else
uart.on(1, "receive", function(id, len)
local data = uart.read(id, len)
log.info(PROJECT .. ".receive-" .. id, data)
end)
sys.timerLoopStart(function()
uart.write(1, "Hi,I am Air101\n")
end, 2000)
end
sys.run()