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)。在实际应用中,这些管脚的使用取决于具体的通信需求和硬件配置。
二、演示功能概述
本文将演示如何在 Air201模组上实现 UART(通用异步收发传输器)的通信。演示功能主要包括以下几个方面:
1. 初始化 UART:将介绍如何配置 UART 的波特率、数据位、停止位和校验位等参数,并初始化 UART。
2. 接收数据:将展示如何通过注册接收事件的回调函数来接收来自 UART 的数据,并处理接收到的数据。
3. 发送数据:将介绍如何使用 UART 的 API 接口来发送数据,包括发送普通字符串、十六进制数据和 JSON 格式的数据。
4. 串口通信:将展示如何在 Air201模组上实现单串口通信,包括配置和发送接收数据的步骤。
5. RS485 通信:将展示如何在 Air201模组上实现 RS485 通信,包括配置和发送接收数据的步骤。
6. USB 虚拟串口:将介绍如何在 Air201模组上使用 USB 虚拟串口进行通信,包括配置和发送接收数据的步骤。
通过这些演示,大家可以了解如何在 Air201模组上实现 UART 通信,包括初始化、接收和发送数据、以及实现串口、RS485 和 USB 虚拟串口通信等。
三、演示硬件环境
3.1 开发板
本文主要以 Air201模组+连接扩展板为例进行演示
1. Air201模组
使用 Air201模组,如下图所示:
点击链接购买:合宙Air201模组淘宝购买链接 ;
此模组的详细使用说明参考:Air201 产品手册 。
2. Air201扩展板
使用 Air201扩展板,如下图所示:
3.2 SIM 卡
在中国大陆环境下,使用移动,电信,联通的物联网卡或者手机卡都可以。
3.3 PC 电脑
PC 电脑推荐使用 Windows10 及以上版本。
3.4 数据通信线
1. USB 转 Type-C 数据线
它的一端是 USB 接口,另一端是 Type-C 接口。
2. USB 转 TTL 工具或者串口线
由于本文教程与串口有关,所以需要大家准备 USB 转 TTL 工具或者串口线,例如 CH340、FT232 等。本文教程使用的USB 转 TTL 工具如下示意图所示:
3. USB 转 RS485 模块
由于本文教程涉及 RS485 通信,所以需要大家准备 USB 转 RS485 模块。此为 购买链接 。 需要注意的是,该购买链接只是推荐,大家也可以多看看其他店铺。
四、演示软件环境
4.1 Luatools 下载调试工具
Luatools 工具由合宙推出,支持最新固件获取、固件打包、trace 打印及单机烧录等功能。
工具使用说明参考:Luatools 下载和详细使用
4.2 LLCOM 串口通信工具
LLCOM 作为简单实用的串口通信助手工具,可以在计算机与设备之间建立串口通信连接,实现数据的发送与接收。
工具使用说明参考:LLCOM | 能跑Lua代码的串口调试工具!,详细使用说明可以直接参考下载网站。
4.3 LuatOS 固件和脚本 demo 代码
1. LuatOS 固件
LuatOS 固件下载位置参考:LuatOS 底层 core 注:本 demo 使用如图所示固件
2. 脚本 demo 代码
脚本 demo 仓库参考:https://gitee.com/openLuat/LuatOS-Air210
本文所用到的 demo 位置参考:https://gitee.com/openLuat/LuatOS-Air210/tree/master/demo/uart
至于如何拉取仓库代码,请大家自行百度查询。
五、软硬件资料
5.1 uart 库介绍
5.1.1 主要功能介绍
uart 库即串口操作库,该库为内部库,因此在程序中使用时无需 require 调用。该库主要用于支持 UART(通用异步收发传输)功能,适用于一些嵌入式设备或平台。它使用 C 语言,并结合 Lua 脚本提供了一些 API 供用户方便地控制和操作串口。该库包含如下主要功能:
- 初始化、配置和管理多个串口设备,包括支持软件 UART。
- 发送和接收数据,支持串口的基本通信功能。
- 提供事件回调机制,用户可以注册接收和发送的数据处理函数。
- 允许用户检查串口的存在以及读取剩余数据缓存的大小。
- 支持 485 模式的特定操作及其管理。
5.1.2 API 接口介绍
本教程所用 API 接口参考:uart - 串口操作库 - 合宙文档中心
5.2 串口接线介绍
Air201支持 3 个串口,分别为主串口 MAIN_UART,GPS串口 ,调试串口 DBG_UART。在使用串口时,默认将主串口 MAIN_UART 作为串口 1(UART1),扩展串口 GPS作为串口 2(UART2)。在本文中,将会使用到 UART1。 特别说明,调试串口 DBG_UART 是用来输出模块的运行日志,不能连接任何外设。
5.2.1 串口管脚位置介绍
Air201串口管脚位置说明:
5.2.2 串口接线说明
接下来进行接线操作,注意模块与 MCU 之间要交叉接线,即 TX 接 RX,RX 接 TX,GND 接 GND 。
5.3 Air201模组烧录说明
5.3.1 选择固件和脚本
1. 打开 Luatools 工具
2. 点击 项目管理测试
3. 根据图示操作
注意,大家只需要跟着做到第七步即可,第八步跟着后面的操作再做。
5.3.2 烧录
1. 将 Air201开发板通过 USB 数据线连接至电脑,如下图所示:
2. 根据下方操作进行烧录
Air201进入boot下载模式,烧录固件和程序,需要将预留的测试点(Air201板子 B面图) 的BOOT 上拉到vdd_ext(A面USB旁边),之后上电开机,即可进入下载模式,下载完程序后将boot脚悬空。
Air201板子 A面图
Air201板子 B面图
5.3.3 下载模式下的端口显示
判断是否进入 BOOT 模式:模块上电,此时在电脑的设备管理器中,查看串口设备, 会出现一个端口表示进入了 BOOT 下载模式,如下图所示:
六、代码示例介绍
6.1 初始化
6.1.1 单串口
大家任选其中一个就行,本文使用 MAIN_UART( UART1 )串口进行演示。
- 使用 MAIN_UART( UART1 )串口:
local uartid = 1 -- 使用uart1,可根据实际设备选取不同的uartid
--初始化 参数都可以根据实施情况修改
uart.setup(
uartid,--串口id
115200,--波特率
8,--数据位
1--停止位
)
6.1.2 RS485 串口
local uartid = 1 -- 根据实际设备选取不同的uartid
local uart485Pin = 22 -- 用于控制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.1.3 USB 虚拟串口
local uartid = uart.VUART_0 -- 使用USB虚拟串口,固定id
--初始化 参数都可以根据实施情况修改
uart.setup(
uartid,--串口id
115200,--虚拟串口的波特率选择多少都无所谓
8,--数据位
1--停止位
)
6.2 注册接收数据的回调函数
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.3 发送数据
- 发送普通字符串
uart.write(uartid, "\r\nRDY\r\nmodel:" .. 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 串口
7.1.1 接线展示
下方为 MAIN_UART 的接线图
7.2 RS485 通信
7.2.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.2.2 接线展示
下图中BTB扩展板的A接USB 转 RS485的A,BTB扩展板的B接USB 转 RS485的B。
完整接线图:
7.2.3 运行结果展示
7.3 USB 虚拟串口
7.3.1 USB 虚拟串口介绍
USB 虚拟串口是一种将 USB 接口转换为串行通信接口的技术。它允许计算机通过 USB 接口与其他设备进行串行通信,如调制解调器、打印机、扫描仪等。USB 虚拟串口通常由一个 USB 转串行适配器和一个驱动程序组成。
并且虚拟串口通常没有波特率要求,因为它们是软件模拟的串行通信接口,不依赖于物理硬件。然而,在实际应用中,虚拟串口仍然需要遵守一些基本的通信协议,比如数据位、停止位和校验位等。
USB 虚拟串口的主要功能包括:
- 串行通信:USB 虚拟串口可以模拟串行通信接口,实现数据的串行传输。它支持各种串行通信协议,如 RS-232、RS-485 等。
- 传输可靠:传统的串口连接线容易受到干扰,而 USB 虚拟串口采用的 USB 技术可以更好地抵抗干扰,提高了通信的可靠性。
- 串行控制:USB 虚拟串口可以控制串行通信参数,如波特率、数据位、停止位、奇偶校验等。它还支持串行通信的流控制和错误处理。
- 使用方便:USB 虚拟串口无需再使用传统的串口连接线,只需要一个标准的 USB 数据线即可连接计算机和外部设备,使得设备连接更加方便
USB 虚拟串口广泛应用于各种领域,如工业自动化、物联网、智能家居等。它为各种设备提供了便捷的串行通信解决方案,提高了系统的灵活性和可靠性。
7.3.2 虚拟通讯串口-端口位置说明
首先通过带有 DM、DP 的 USB 数据线两端连接 模块 和 Windows10 或者 Windows11 系统的电脑。
然后将模块开机,就可以从电脑的设备管理器中看到端口处多出来 3 个 USB 端口。
找到"USB\VID_19D1&PID_0001&MI_06\7&17910EBA&0&0006"就是用于软件控制串口传输的 USB 虚拟串口。
7.3.3 运行结果展示
7.6 UART 电平
7.6.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 电平适用于长距离、高速率的通信。
在串口通信中,选择合适的电平标准非常重要,它直接影响到通信的可靠性和稳定性。
Air201模块的 UART IO 电压默认为 1.8V。
八、总结
本文演示了如何在 Air201 模组上实现 UART(通用异步收发传输器)的通信。
九、扩展
十、常见问题
1. 串口电平电压过低或过高可能会导致什么问题?
如果电压过低,可能会导致接收器无法正确识别信号,如果过高,可能会导致信号损坏或损坏接收器。 概述:可能会导致串口无法正常通讯,或通讯数据会突然出现乱码,数据错乱等问题。