air103#

本章介绍LuatOS的uart库使用方式

简介#

UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。

UART 串口的特点是将数据一位一位地顺序传送,只要 2 根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用 UART 串口通信的端口,这些参数必须匹配,否则通信将无法正常完成。

查阅Air103_MCU设计手册V1.2.pdf可知Air103共有6路UART,UART0固定为下载和日志口

我们使用UART1通过TTL转USB模块与PC连接,实现PC和Air103传递数据

硬件准备#

  • Air103开发板

  • USB转TTL模块

接线示意

        U1_RX/GPIO23  ------  TX  
Air103  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 Air103\n")
-- 将发送缓冲区的指针重新移到开头
sendBuff:seek(0)

初始化uart#

初始化UART1,波特率为921600,8位数据位,1位停止位,无校验

代码如下

uart.setup(1, 921600, 8, 1, uart.None)

注册串口事件回调#

给UART1注册一个接收事件回调,在Air103 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 Air103\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 Air103\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 Air103\n")
    end, 2000)
end

sys.run()