uart - 串口操作库
以下为关键点梳理
一、UART 模块概述
UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传输器,在嵌入式系统中用于实现串行通信。合宙 Luatos 系统为 AIR780EPM 模组提供了完善的 UART API,方便开发者进行串口通信相关的开发工作。以下是对该 UART 模块 API 的详细梳理。
二、核心函数解析
uart.setup()
功能:配置串口参数,是使用串口前的必要初始化步骤。
参数解析:
id
:串口号,指定要配置的串口设备。baud_rate
:波特率,常见的有 9600、115200 等,决定了串行通信的数据传输速率。data_bits
:数据位,通常为 7 或 8,表示每个数据帧中的数据位数。stop_bits
:停止位,可为 1 或 2,用于标识数据帧的结束。parity
:校验位,有 uart.NONE(无校验)、uart.ODD(奇校验)、uart.EVEN(偶校验)等选项,用于错误检测。bit_order
:比特顺序,默认为 uart.LSB( Least Significant Bit,低位在前),也可设置为 uart.MSB(高位在前)。buff_size
:缓冲区大小,根据通信数据量合理设置,避免数据溢出。rs485_gpio
、rs485_level
、rs485_delay
:当使用 RS485 通信时,用于配置收发转换相关的 GPIO 口、电平及延时参数。debug_enable
、error_drop
:调试使能及错误丢弃设置,error_drop
为 0 表示接收错误时不抛弃缓存数据。
示例说明:
lua 复制
-- 常见的 115200 波特率、8 数据位、1 停止位、无校验的配置
uart.setup(1, 115200, 8, 1, uart.NONE)
-- RS485 模式配置,GPIO10 作为收发转换脚
uart.setup(1, 115200, 8, 1, uart.NONE, uart.LSB, 1024, 10, 0, 2000)
-- 遇到接收错误不抛弃缓存数据的配置_
uart.setup(1, 115200, 8, 1, uart.NONE, nil, 1024, nil, nil, nil, nil, 0)
uart.write()
功能:向指定串口写入数据,实现串行数据发送。
参数:
id
:目标串口号。data
:要发送的数据,可以是字符串形式的可见字符,也可以是通过string.char()
转换的十六进制数据。
示例:
lua 复制
-- 发送文本字符串_
uart.write(1, "rdy\r\n")
-- 发送十六进制数据_
uart.write(1, string.char(0x55,0xAA,0x4B,0x03,0x86))
uart.read()
功能:从指定串口读取数据,获取接收到的串行数据。
参数:
id
:源串口号。len
:要读取的数据长度,根据实际需求指定,可避免读取过多无用数据。
返回值:读取到的数据内容,类型通常为字符串。
- uart.close()
功能:关闭指定串口,释放相关资源,当不再使用某串口时应调用此函数。
参数:
id
:要关闭的串口号。
uart.on()
功能:注册串口事件回调,使程序能响应串口的特定事件,如接收数据到达。
参数:
id
:串口号。event
:事件类型,如 "receive" 表示接收数据事件。func
:回调函数,在事件发生时执行,可对事件进行处理。
示例:
lua 复制
uart.on(1, "receive", function(id, len)local data = uart.read(id, len)
log.info("uart", id, len, data)
-- 打印接收到的数据信息_end)
uart.wait485()
功能:在 RS485 模式下,等待发送完成。适用于 MCU 不支持串口发送移位寄存器空或类似中断的情况,在 sent 事件回调后使用,确保数据完全发送。
uart.exist()
功能:检查指定串口号是否存在,可用于验证串口设备是否可用。
uart.rx()
功能:以 buff(缓冲区)形式读取串口数据,一次读出全部数据并存入 buff 中。若 buff 空间不足,会自动扩展。
参数:
id
:串口号。buff
:用于存储读取数据的缓冲区。
uart.rxSize()
功能:读取串口 Rx(接收)缓存中剩余的数据量,便于了解还有多少数据未读取。
返回值:Rx 缓存中剩余数据的字节数。
示例:
lua 复制
local size = uart.rxSize(1)
-- 获取串口 1 接收缓存的剩余数据量_
uart.rxClear()
功能:清除串口 Rx 缓存中的剩余数据,当不需要之前接收的数据时可调用此函数释放缓存空间。
uart.tx()
功能:以 buff 形式写串口,等同于 C 语言中的 uart_tx(uart_id, &buff[start], len)
,提供更灵活的数据发送方式。
参数:
id
:串口号。buff
:要发送的数据缓冲区。start
:发送数据的起始位置。len
:要发送的数据长度。
三、总结
合宙 Luatos 的 UART 模块提供了全面且灵活的 API,涵盖了串口通信的各个方面,从基本的参数配置、数据读写,到高级的事件回调、软件 UART 设置等,满足了不同场景下的串行通信需求。开发者在使用时,应根据具体的硬件平台(如 Air780EPM)和应用场景,合理选择和调用这些 API,以实现高效、稳定的串口通信功能。
以下为详细说明
常量
常量 | 类型 | 解释 |
---|---|---|
uart.Odd | number | 奇校验,大小写兼容性 |
uart.Even | number | 偶校验,大小写兼容性 |
uart.None | number | 无校验,大小写兼容性 |
uart.ODD | number | 奇校验 |
uart.EVEN | number | 偶校验 |
uart.NONE | number | 无校验 |
uart.LSB | number | 小端模式 |
uart.MSB | number | 大端模式 |
uart.VUART_0 | number | 虚拟串口0 |
uart.ERROR_DROP | number | 遇到错误时抛弃缓存的数据 |
uart.DEBUG | number | 开启调试功能 |
uart.setup(id, baud_rate, data_bits, stop_bits, partiy, bit_order, buff_size, rs485_gpio, rs485_level, rs485_delay, debug_enable, error_drop)
配置串口参数
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1, 如此类推, 最大值取决于设备 |
int | 波特率, 默认115200,可选择波特率表:{2000000,921600,460800,230400,115200,57600,38400,19200,9600,4800,2400} |
int | 数据位,默认为8, 可选 7/8 |
int | 停止位,默认为1, 根据实际情况,可以有0.5/1/1.5/2等 |
int | 校验位,可选 uart.None/uart.Even/uart.Odd |
int | 大小端,默认小端 uart.LSB, 可选 uart.MSB |
int | 缓冲区大小,默认值1024 |
int | 485模式下的转换GPIO, 默认值0xffffffff |
int | 485模式下的rx方向GPIO的电平, 默认值0 |
int | 485模式下tx向rx转换的延迟时间,默认值12bit的时间,单位us, 9600波特率填20000 |
int | 开启调试功能,默认使能,填写uart.DEBUG或者非数字使能,其他值都是关闭 |
int | 遇到接收错误是否放弃缓存数据,默认使能,填写uart.ERROR_DROP或者非数字使能,其他值都是关闭,目前只有移芯平台支持 |
返回值
返回值类型 | 解释 |
---|---|
int | 成功返回0,失败返回其他值 |
例子
-- 最常用115200 8N1
uart.setup(1, 115200, 8, 1, uart.NONE)
-- 可以简写为 uart.setup(1)
-- 485自动切换, 选取GPIO10作为收发转换脚
uart.setup(1, 115200, 8, 1, uart.NONE, uart.LSB, 1024, 10, 0, 2000)
-- 遇到接收错误不抛弃缓存数据
uart.setup(1, 115200, 8, 1, uart.NONE, nil, 1024, nil, nil, nil, nil, 0)
uart.write(id, data)
写串口
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
string/zbuff | 待写入的数据,如果是zbuff会从指针起始位置开始读 |
int | 可选,要发送的数据长度,默认全发 |
返回值
返回值类型 | 解释 |
---|---|
int | 成功的数据长度 |
例子
-- 写入可见字符串
uart.write(1, "rdy\r\n")
-- 写入十六进制的数据串
uart.write(1, string.char(0x55,0xAA,0x4B,0x03,0x86))
uart.read(id, len)
读串口
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
int | 读取长度 |
file/zbuff | 可选:文件句柄或zbuff对象 |
返回值
返回值类型 | 解释 |
---|---|
string | 读取到的数据 / 传入zbuff时,返回读到的长度,并把zbuff指针后移 |
例子
uart.read(1, 16)
uart.close(id)
关闭串口
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
返回值
返回值类型 | 解释 |
---|---|
nil | 无返回值 |
例子
uart.close(1)
uart.on(id, event, func)
注册串口事件回调
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
string | 事件名称 |
function | 回调方法 |
返回值
返回值类型 | 解释 |
---|---|
nil | 无返回值 |
例子
uart.on(1, "receive", function(id, len)
local data = uart.read(id, len)
log.info("uart", id, len, data)
end)
uart.wait485(id)
等待485模式下TX完成,mcu不支持串口发送移位寄存器空或者类似中断时才需要,在sent事件回调后使用
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
返回值
返回值类型 | 解释 |
---|---|
int | 等待了多少次循环才等到tx完成,用于粗劣的观察delay时间是否足够,返回不为0说明还需要放大delay |
例子
无
uart.exist(id)
检查串口号是否存在
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1, 如此类推 |
返回值
返回值类型 | 解释 |
---|---|
bool | 存在返回true |
例子
无
uart.rx(id, buff)
buff形式读串口,一次读出全部数据存入buff中,如果buff空间不够会自动扩展
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
zbuff | zbuff对象 |
返回值
返回值类型 | 解释 |
---|---|
int | 返回读到的长度,并把zbuff指针后移 |
例子
uart.rx(1, buff)
uart.rxSize(id)
读串口Rx缓存中剩余数据量
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
返回值
返回值类型 | 解释 |
---|---|
int | 返回读到的长度 |
例子
local size = uart.rxSize(1)
uart.rxClear(id)
清除串口Rx缓存中剩余数据量
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
返回值
无
例子
uart.rxClear(1)
uart.tx(id, buff, start, len)
buff形式写串口,等同于c语言uart_tx(uart_id, &buff[start], len);
参数
传入值类型 | 解释 |
---|---|
int | 串口id, uart0写0, uart1写1 |
zbuff | 待写入的数据,如果是zbuff会从指针起始位置开始读 |
int | 可选,要发送的数据起始位置,默认为0 |
int | 可选,要发送的数据长度,默认为zbuff内有效数据,最大值不超过zbuff的最大空间 |
返回值
返回值类型 | 解释 |
---|---|
int | 成功的数据长度 |
例子
uart.tx(1, buf)