跳转至

UART

一、串口(UART)概述

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

1.1 UART 的基本概念

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

1.2 UART 的物理连接

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

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

Air780EGH模块只保留了3 线串口(RX/TX/GND),主要因为: - 模块串口遵循 MODEM 串口标准,DTR、DSR、CTS、RTS 信号采用直连方式(不要交叉连接),与标准 RS232 连接方式不同。 - 在物联网串口应用中,通常保留 TX/RX 加流控管脚的 5 线串口形式,但模块的 CTS 管脚起标准 RTS 功能,RTS 管脚起标准 CTS 功能。 - 流控管脚也可省略,形成 3 线串口(RX/TX/GND)。

具体参考UART电路介绍

二、演示功能概述

本文将演示如何在 Air780EGH 开发板上实现 UART(通用异步收发传输器)的通信。演示功能主要包括以下几个方面:

1. 初始化 UART:将介绍如何配置 UART 的波特率、数据位、停止位和校验位等参数,并初始化 UART。

2. 接收数据:将展示如何通过注册接收事件的回调函数来接收来自 UART 的数据,并处理接收到的数据。

3. 发送数据:将介绍如何使用 UART 的 API 接口来发送数据,包括发送普通字符串、十六进制数据和 JSON 格式的数据。

4. 串口通信:将展示如何在 Air780EGH 开发板上实现单串口通信,包括配置和发送接收数据的步骤。

5. RS485 通信:讲解 RS485 通信,包括配置和发送接收数据。

7. USB 虚拟串口:将介绍如何在 Air780EGH 开发板上使用 USB 虚拟串口进行通信,包括配置和发送接收数据的步骤。

8. UART 电平:将介绍 UART 电平的标准和如何在 Air780EGH 开发板上修改 UART 电平。

通过这些演示,大家可以了解如何在 Air780EGH 开发板上实现 UART 通信,包括初始化、接收和发送数据、以及实现串口、RS485 和 USB 虚拟串口通信等。

三、演示硬件环境

3.1 开发板

本文主要以 Air780EGH 开发板为例进行演示。

Air780EGH 开发板

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

四、软件环境

在开始实践本示例之前,先筹备一下软件环境:

1. Luatools工具

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

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

脚本和资源文件点我,查看demo链接

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

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

五、软硬件资料

5.1 uart 库介绍

5.1.1 主要功能介绍

uart 库即串口操作库,该库为内部库,因此在程序中使用时无需 require 调用。 该库包含如下主要功能:

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

5.1.2 API 接口介绍

本教程所用 API 接口参考:uart - 串口操作库 - 合宙文档中心

5.2 串口接线介绍

主串口 UART1:用于模块的数据传输和外部通信及模块控制,特性包括: TTL 电平串口,电平为 3.0V(默认)/1.8V,可通过 PIN100 管脚或二次开发代码配置 IO 电平电压。 支持模块休眠唤醒功能(LPUART),在休眠时只有主串口可接收数据唤醒模块,但非 9600 波特率下唤醒会丢失前几个字节。 待机状态下为高电平。

扩展串口 UART3:电气特性与主串口相同,但不支持休眠唤醒功能。

调试串口 UART0:用于输出模块运行日志,固定波特率 921600 不可更改,不建议连接外设,但需预留测试点。其日志数据有专门协议,普通串口工具抓取会显示乱码,需使用指定的专用调试工具。

UART2已经用作通信主芯片和GNSS芯片之间的通信用,故不能用作它用,建议将PIN28 PIN29引出测试点,以便在调试所需时方便飞线

libgnss中,需要配置UART2为主芯片和GNSS芯片之间的通信串口。

5.2.1 串口管脚位置介绍

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

5.2.2 串口接线说明

注意模块与 MCU 之间要交叉接线,即 TX 接 RX,RX 接 TX,GND 接 GND 。

六、代码示例介绍

6.1 初始化

6.1.1 单串口

大家任选其中一个就行,本文使用 UART1 串口进行演示。

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

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

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

6.1.2 多串口

本文以UART1和UART3两个串口进行演示

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

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

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

6.1.3 RS485 串口

RS485电路参考的原理图(具体参考Air780EGH 485 硬件电路说明):

硬件接口: UART1:默认支持 RS485 模式,需外接 RS485 收发器。

TXD/RXD:连接 RS485 收发器的 DI/RO 端。

RE/DE(收发控制引脚):通过 GPIO(如 GPIO24)控制,需在代码中配置。

A/B 线接屏蔽双绞线,屏蔽层单端接地。

LuatOS 提供封装函数简化配置,支持 Modbus-RTU/TCP/ASCII 协议。 Modbus就是一种用在工业上的简单协议,是主从方式通信,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。主站发送相关的通信指令读取或者写入相关数据,从站就按相关指令返回对应的数据。 Modbus协议支持多种通信协议,包括TCP/IP、UDP、RTU、ASCII等。

local uartid = 1        -- 根据实际设备选取不同的uartid
local uart485Pin = 24   -- 用于控制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 低电平
    20000,       -- 485模式下tx向rx转换的延迟时间,单位us
    )

6.1.4 USB 虚拟串口

USB 虚拟串口是一种将 USB 接口转换为串行通信接口的技术。它允许计算机通过 USB 接口与其他设备进行串行通信,如调制解调器、打印机、扫描仪等。USB 虚拟串口通常由一个 USB 转串行适配器和一个驱动程序组成。 并且虚拟串口通常没有波特率要求,因为它们是软件模拟的串行通信接口,不依赖于物理硬件。然而,在实际应用中,虚拟串口仍然需要遵守一些基本的通信协议,比如数据位、停止位和校验位等。 USB 虚拟串口的主要功能包括: - 串行通信:USB 虚拟串口可以模拟串行通信接口,实现数据的串行传输。它支持各种串行通信协议,如 RS-232、RS-485 等。 - 传输可靠:传统的串口连接线容易受到干扰,而 USB 虚拟串口采用的 USB 技术可以更好地抵抗干扰,提高了通信的可靠性。 - 串行控制:USB 虚拟串口可以控制串行通信参数,如波特率、数据位、停止位、奇偶校验等。它还支持串行通信的流控制和错误处理。 - 使用方便:USB 虚拟串口无需再使用传统的串口连接线,只需要一个标准的 USB 数据线即可连接计算机和外部设备,使得设备连接更加方便 USB 虚拟串口广泛应用于各种领域,如工业自动化、物联网、智能家居等。它为各种设备提供了便捷的串行通信解决方案,提高了系统的灵活性和可靠性。

local uartid = uart.VUART_0 -- 使用USB虚拟串口,固定id

--初始化 参数都可以根据实施情况修改
uart.setup(
    uartid,--串口id
    115200,--虚拟串口的波特率选择多少都无所谓
    8,--数据位
    1--停止位
)

6.2 UART 电平

6.2.1 UART 电平介绍

UART 电平是指串行通信中使用的电压电平标准。常见的串口电平标准有 RS-232、TTL 和 RS-485 等。 1. RS-232 电平:RS-232 是一种常用的串口通信标准,它使用负逻辑电平,即逻辑 1 用 -3V 到 -15V 表示,逻辑 0 用 +3V 到 +15V 表示。RS-232 电平适用于短距离、低速率的通信。 2. TTL 电平:TTL(Transistor-Transistor Logic)电平是一种常见的数字电路电平标准,它使用正逻辑电平,即逻辑 1 用 +5V 表示,逻辑 0 用 0V 表示。TTL 电平适用于短距离、高速率的通信。 3. RS-485 电平:RS-485 是一种常用的串口通信标准,它使用差分电平,即逻辑 1 用 +2V 到 +6V 表示,逻辑 0 用 -2V 到 -6V 表示。RS-485 电平适用于长距离、高速率的通信。 在串口通信中,选择合适的电平标准非常重要,它直接影响到通信的可靠性和稳定性。

6.2.2 默认 UART 电压如何修改

6.2.2.1 通过软件调用接口

在 luatOS 开发中,开机时通过使用 pm.ioVol() 接口,可以实现更改串口的电压。下面是使用实例:

注意:软件通过接口设置的电压优先级要比硬件 IO_Volt_Set 引脚(pin 100)的要高。 例如:将 100 脚接 GND,但软件配置了 pm.ioVol(pm.>IOVOL_ALL_GPIO, 1800), 那么在模块开机时 IO 高电平的电压首先会以硬件 3.0V 输出,然后执行到软件脚本上面配置的 pm.ioVol() 接口时,IO 电压最终会变为输出 1.8V 。

-- pm.ioVol接口第二个参数设置电压范围:(1650~2000,2650~3400) 单位毫伏
-- 接口调用位置可以放到task里面,也可以放在task外面
-- 切换成3.0v
pm.ioVol(pm.IOVOL_ALL_GPIO, 3300)    -- 所有GPIO高电平输出3.0V

-- 切换成1.8v
pm.ioVol(pm.IOVOL_ALL_GPIO, 1800)    -- 所有GPIO高电平输出1.8V

6.2.2.2 通过硬件 iosel 引脚控制电压

Air780EGH 模块硬件中可通过 100 脚(IO_Volt_Set),此脚悬空 IO 电平在开机时会变为 3.0V,如果接 GND 那模块在开机时 IO 电平就会变成 1.8V。

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

uart.on 函数用于注册一个接收事件的回调函数,当指定的串口 uartid 接收到数据时,该回调函数会被自动触发并执行。回调函数通过 uart.on(uartid1, "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.4 发送数据

本文中字符串编码格式为 UTF-8 编码格式,SSCOM 串口调试工具无法正确显示字符串中的中文,需要注意。

  • 发送普通字符串
uart.write(uartid, "\r\nRDY\r\n模块型号:" .. hmeta.model())
  • 发送十六进制的数据串
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 串口演示

接线展示:

下方为 UART1的接线图

串口运行结果展示:

串口工具接收到Air780EGH串口发送的数据:

串口工具发送 "Air780EGH" 到Air780EGH模块:

同一时间Air780EGH接收到串口发送的 "Air780EGH" :

7.2 USB 虚拟串口展示

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

例程验证: 把虚拟串口例程烧录到开发板,打开串口工具,可以看到Air780EGH模块向串口工具发送的数据,如图:

串口工具发送数据,Air780EGH模块也能收到数据,如图:

八、总结

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

九、常见问题

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

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

2. 有没有推荐的串口设计电路可以作为参考?

有,请跳转至 https://docs.openluat.com/Air780EGH/luatos/hardware/design/uart/ 查看