跳转至

UART

一、串口(UART)概述

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种常用的串行通信协议,广泛应用于单片机或各种嵌入式设备之间的通信。以下是UART的详细介绍:

1.1 UART的基本概念

UART是一种串行通信接口,它允许设备通过串行通信方式发送和接收数据。UART通信是异步的,这意味着通信双方不需要共享一个时钟信号来同步数据传输。UART通信通常用于嵌入式系统中,如微控制器与其他设备之间的数据交换。

1.2 UART的物理连接

UART通信通常只需要两条线:一条用于数据的发送(TX),一条用于数据的接收(RX)。此外,还需要一条地线(GND)来提供一个共同的参考电平,确保信号的准确性。在实际连接时,一个设备的TX线需要连接到另一个设备的RX线,反之亦然,这样才能实现双向通信。

1.3 UART的数据格式

UART通信的数据格式包括以下几个部分:

  • 起始位:标识数据帧的开始,通常为一个逻辑“0”的位。
  • 数据位:紧随起始位之后,包含实际要传输的数据。数据位的长度可以根据需要设置为 5、6、7、8 或 9 位。
  • 奇偶校验位(可选):用于错误检测,可以是奇校验、偶校验或无校验。
  • 停止位:标识数据帧的结束,可以是 1 位、1.5 位或 2 位。停止位通常为逻辑“1”。

1.4 波特率

波特率是UART通信中最重要的参数之一,它定义了数据传输的速率,即每秒钟传输的位数。常见的波特率值有300、600、1200、2400、4800、9600、19200、38400、57600、115200等。波特率必须在通信双方之间进行匹配,否则数据将无法正确传输。

1.5 额外的信号管脚

除了基本的TX和RX管脚,UART还有其他一些信号管脚,这些管脚用于实现更高级的通信功能,如流控制等:

  • DTR(Data Terminal Ready):数据终端就绪信号,用于指示数据终端设备(DTE)已经准备好进行通信。
  • DSR(Data Set Ready):数据集就绪信号,用于指示数据通信设备(DCE)已经准备好进行通信。
  • DCD(Data Carrier Detect):数据载波检测信号,用于指示检测到载波信号,即通信链路已经建立。
  • RI(Ring Indicator):响铃指示信号,用于指示有来电。
  • nRTS(Request To Send):请求发送信号,用于硬件流控制,当设备准备好发送数据时,此信号为低电平。
  • nCTS(Clear To Send):清除发送信号,用于硬件流控制,当设备准备好接收数据时,此信号为低电平。

这些额外的管脚主要用于实现硬件流控制(如 RTS/CTS)和调制解调器控制(如 DTR/DSR/DCD/RI)。在实际应用中,这些管脚的使用取决于具体的通信需求和硬件配置。

二、演示功能概述

本文将演示如何在Air8101开发板上实现UART(通用异步收发传输器)的通信。演示功能主要包括初始化UART、通过UART方式收发数据、单串口通信、多串口通信、RS485通信等。通过这些演示,大家可以更好的了解与使用UART通信。

三、准备硬件环境

“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”

参考:硬件环境清单,准备以及组装好硬件环境。

四、准备软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools 工具

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V10001_Air8101.soc;参考项目使用的内核固件

3. luatos 需要的脚本和资源文件

脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/UART

lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101 开发板,将本篇文章中演示使用的项目文件烧录到 Air8101 开发板中。

五、软硬件资料

5.1 uart库介绍

5.1.1 主要功能介绍

uart库即串口操作库,该库为内部库,因此在程序中使用时无需require调用。该库主要用于支持UART(通用异步收发传输)功能,适用于一些嵌入式设备或平台。它使用C语言,并结合Lua脚本提供了一些API供用户方便地控制和操作串口。该库包含如下主要功能:

  • 初始化、配置和管理多个串口设备,包括支持软件UART。
  • 发送和接收数据,支持串口的基本通信功能。
  • 提供事件回调机制,用户可以注册接收和发送的数据处理函数。
  • 允许用户检查串口的存在以及读取剩余数据缓存的大小。
  • 支持 485 模式的特定操作及其管理。

5.1.2 API接口说明

本教程所使用的接口函数不再做详细介绍,可通过此链接查看具体介绍:uart - 串口操作库

5.2 串口接线介绍

Air8101开发板支持3路串口,分别为UART0、UART1、UART2。在本文中,将会使用到UART1和UART2。

5.2.1 串口管脚位置介绍

下方为Air8101开发板的串口管脚位置图

Air8101开发板串口管脚位置说明:

图片后续在此补充......

六、代码示例介绍

6.1 初始化

6.1.1 单串口

Air8101开发板提供3路串口,大家任选其一即可,本文使用UART1口进行演示

  • 使用UART1串口:
local uartid = 1 -- 使用uart1,可根据实际设备选取不同的uartid

--初始化 参数都可以根据实施情况修改
uart.setup(
    uartid,--串口id
    115200,--波特率
    8,--数据位
    1--停止位
)
  • 使用UART2串口:
local uartid = 2 -- 使用uart2

--初始化 参数都可以根据实施情况修改
uart.setup(
    uartid,--串口id
    115200,--波特率
    8,--数据位
    1--停止位
)

6.1.2 多串口

本文使用UART1、UART2两路串口进行演示

-- 根据实际设备选取不同的uartid
local uartid1 = 1 -- 第一个串口id
local uartid2 = 2 -- 第二个串口id

-- 初始化第一个串口
uart.setup(
    uartid1,--串口id
    115200,--波特率
    8,--数据位
    1--停止位
)

-- 初始化第一个串口
uart.setup(
    uartid2,--串口id
    115200,--波特率
    8,--数据位
    1--停止位
)

6.1.3 RS485串口

本文依旧使用UART1口进行演示

local uartid = 1        -- 根据实际设备选取不同的uartid
local uart485Pin = 16   -- 用于控制485接收和发送的使能引脚

--初始化 
uart.setup(
    uartid,     -- 串口id
    9600,       -- 波特率
    8,          -- 数据位
    1,          -- 停止位
    uart.NONE,  -- 校验位
    uart.LSB,   -- 大小端,uart.LSB为小端,uart.MSB为大端
    1024,       -- 缓冲区大小 1024
    uart485Pin, -- 485转换的GPIO
    0,          -- 485模式rx方向的gpio的电平,默认0 低电平
    2000,       -- 485模式下tx向rx转换的延迟时间,单位us
    )

6.2 注册接收数据的回调函数

uart.on函数用于注册一个接收事件的回调函数,当指定的串口uartid接收到数据时,该回调函数会被自动触发并执行。回调函数通过 uart.on(uartid, "receive", function(id, len) ... end)定义,并处理接收到的数据。数据的读取是通过uart.read()函数进行的,uart.read()函数是非阻塞的,它是直接从现有缓存区中直接读取数据。

-- 收取数据会触发回调, 这里的 "receive" 是固定值不要修改。
uart.on(uartid, "receive", function(id, len)
    local s = ""
    repeat
        s = uart.read(id, 128)
        if #s > 0 then -- #s 是取字符串的长度
            -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
            log.info("uart", "receive", id, #s, s)
            log.info("uart", "receive(hex)", id, #s, s:toHex())   -- 如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到,可以用以hex格式打印
        end
    until s == ""
end)

6.3 发送数据

特别注意:SSCOM串口工具不支持UTF-8编码格式的中文内容,会显示乱码。建议更换其他串口工具。

  • 发送普通字符串
uart.write(uartid, "test data.")
  • 发送十六进制的数据串
uart.write(uartid, string.char(0x55,0xAA,0x4B,0x03,0x86))
  • 通过 zbuff 的方式发送数据
local buff = zbuff.create(1024)
buff:copy(0, "aa:bb:cc:dd, zbuff!")
uart.tx(uartid, buff)
  • 发送 json 格式的数据
local data =
{
    host = "abcdefg.com",
    port = "1883",
    clientID = "c88885",
    username = "user",
    password = "123456",
    ca_self = {ssl=false},
}

local jsondata = json.encode(data)
uart.write(uartid, jsondata)

七、功能验证

7.1 单串口

7.1.1 接线展示

下方为UART1的接线示意图

图片后续在此补充......

7.1.2 运行结果展示

特别注意: SSCOM串口工具不支持UTF-8编码格式的中文内容,会显示乱码。建议更换其他串口工具。 串口工具中的波特率要与代码中设置的波特率保持一致。

1. 在代码中编写一个模组每两秒自动通过UART1口发送一次数据的功能,PC 端使用串口工具通过UART1口查看是否两秒收到一次数据,若收到,则表示测试成功。

2. PC端使用串口工具通过UART1口向模组发送数据,模组通过UART1口可以正常接收到数据,即表示测试成功。

7.2 多串口

7.2.1 接线展示

图片后续在此补充......

7.2.2 运行结果展示

特别注意: SSCOM 串口工具不支持UTF-8编码格式的中文内容,会显示乱码。建议更换其他串口工具。 串口工具中的波特率要与代码中设置的波特率保持一致。

1. 在代码中编写一个模组每2秒分别自动通过UART1口和UART2口发送一次数据的功能,PC端分别使用两个串口工具通过UART1口和UART2口查看是否2秒收到一次数据,若收到,则表示测试成功。

2. PC端使用两个串口工具分别通过UART1口和UART2口向模组发送数据,模组分别通过UART1口和UART2口可以正常接收到数据,即表示测试成功。

7.3 RS485通信

7.3.1 RS485通信介绍

物联网(IoT)在工业场景中的应用越来越广泛,而RS485 是一种常见的通信协议,广泛应用于工业自动化和物联网系统中。RS485是一种串行通信标准,主要用于长距离、多节点通信。适用于工业环境中的传感器、执行器、控制器等设备之间的数据传输,且支持多点通信,可以连接多个设备,实现分布式控制。因为具有较好的抗干扰能力,也很适用于噪声环境下的通信。RS485支持长距离传输,通常可达1200米,适用于工业现场中的远程监控和控制。

RS485是一种半双工通信协议。半双工通信协议允许数据在两个方向上传输,但同一时间只能在一个方向上传输数据。在RS485通信中,当发送数据时,只能发送数据而不能接收数据;当接收数据时,只能接收数据而不能发送数据。

比如:在RS485通信中,通常使用一个引脚(如A或RX)作为发送引脚,另一个引脚(如B或TX)作为接收引脚。当发送数据时,发送引脚输出高电平或低电平,接收引脚不工作;当接收数据时,接收引脚输出高电平或低电平,发送引脚不工作。有的也有单独一根线专门用于控制收发逻辑,输出高低电平,负责管理 RS485 的通讯,包括发送、接收、处理错误等数据。

优点

  • 抗干扰能力强:RS485采用差分信号传输,抗干扰能力强,适用于工业环境中的噪声干扰。
  • 传输距离远:RS485支持长距离传输,适用于工业现场中的远程监控和控制。
  • 多节点通信:RS485支持多点通信,可以连接多个设备,实现分布式控制。
  • 兼容性好:RS485是一种标准化的通信协议,具有较好的兼容性,可以与其他设备进行通信。
  • 成本较低:RS485模块和电缆的成本相对较低,适用于工业现场中的成本控制。

缺点

  • 信号衰减:随着距离的增加,信号衰减会加剧,影响通信质量。
  • 速率限制:RS485的传输速率相对较低,通常在9600bps到115200bps之间,适用于低速数据传输。
  • 电气特性要求:RS485对电气特性有较高的要求,需要使用特定的电缆和连接器。
  • 布线复杂:RS485需要使用双绞线进行布线,布线复杂度较高。

7.3.2 接线展示

图片后续在此补充......

7.3.3 运行结果展示

特别注意: SSCOM串口工具不支持UTF-8编码格式的中文内容,会显示乱码。建议更换其他串口工具。 串口工具中的波特率要与代码中设置的波特率保持一致。

1. 在代码中编写一个模组每2秒通过UART1口发送一次数据的功能,硬件方面将UART1口与TTL转RS485模组、USB转RS485模组接到PC端实现RS485通信方式,此时若PC端使用串口工具可以收到数据,则表示测试成功。

2. PC端使用串口工具向模组发送数据,若模组接收到数据,则表示测试成功。

八、总结

本文将演示如何在Air8101开发板上实现UART(通用异步收发传输器)的通信。

九、扩展

后续扩展在此补充,敬请期待......

十、常见问题

  1. 串口电平电压过低或过高可能会导致什么问题?

如果电压过低,可能会导致接收器无法正确识别信号,如果过高,可能会导致信号损坏或损坏接收器。 概述:可能会导致串口无法正常通讯,或通讯数据会突然出现乱码,数据错乱等问题。