前言:基于RT的资料相对较少,本章参考RT官网文档写下这篇文章,仅仅是对于自己学习RTT操作系统的总结和复习,仅供参考,有问题欢迎提出。
首先我们简单回顾一下UART的知识
一.UART设备
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种常见的异步串口通信协议,主要用于点对点数据传输。UART 工作时,将每个字符的数据一位一位地传输,实现简单、双向的串行通信。UART 需要的主要参数有:波特率、起始位、数据位、停止位、奇偶校验位。这些参数在通信双方必须匹配,才能实现正常的数据传输。
二.RT_Thread串口设备操作接口
应用程序通过RT_Thread提供的I/O设备管理接口来访问串口硬件,如下:
函数 | 描述 |
rt_device_find() | 查找设备 |
rt_device_open() | 打开设备 |
rt_device_read() | 读取数据 |
rt_device_write() | 写入数据 |
rt_device_control() | 控制设备 |
rt_device_set_rx_indicate() | 设置接收回调函数 |
rt_device_set_tx_complete() | 设置发送完成回调函数 |
rt_device_close() | 关闭设备 |
1.查找串口设备
rt_device_t rt_device_find(const char* name);
参数name 是设备名称,返回设备句柄或 RT_NULL
(没有找到设备)。
2.打开串口设备
rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags);
#define RT_DEVICE_FLAG_STREAM 0x040 /* 流模式 */
/* 接收模式参数 */
#define RT_DEVICE_FLAG_INT_RX 0x100 /* 中断接收模式 */
#define RT_DEVICE_FLAG_DMA_RX 0x200 /* DMA 接收模式 */
/* 发送模式参数 */
#define RT_DEVICE_FLAG_INT_TX 0x400 /* 中断发送模式 */
#define RT_DEVICE_FLAG_DMA_TX 0x800 /* DMA 发送模式 */
3.控制串口设备
rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg);
-
参数
cmd
可取值RT_DEVICE_CTRL_CONFIG
,用于配置 UART。 -
arg
是控制的参数结构体serial_configure
,其成员包括波特率、数据位、校验位、缓冲区大小等。
4.发送数据
rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size);
参数 buffer
是要发送的数据,size
是数据的大小。
5.接收数据
rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size);
buffer
是存放接收到数据的缓冲区,size
是要读取的数据大小
6.设置接收回调函数
rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size));
参数 rx_ind
是接收数据的回调函数。
7.关闭串口设备
rt_err_t rt_device_close(rt_device_t dev);
应用实例:
#include <rtthread.h>//RT核心头文件
#include <rtdevice.h>//RT设备抽象层头文件
#define UART_NAME "uart1" // 串口名称
int main(void)
{
rt_device_t serial;//存储 UART 设备的句柄
char str[] = "Hello RT-Thread!\n";//发送
char buffer[64];//接收
int length;
// 查找并打开串口设备
serial = rt_device_find(UART_NAME);//查找设备,返回给句柄
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); // 打开串口,启用中断接收
// 发送数据
rt_device_write(serial, 0, str, sizeof(str));
// 接收数据
length = rt_device_read(serial, 0, buffer, sizeof(buffer));
if (length > 0)
{
rt_kprintf("Received data: %s\n", buffer);
}
// 关闭串口设备
rt_device_close(serial);
return 0;
}
三.总结
RT-Thread 的串口框架通过与底层 HAL 库对接,提供了统一的串口操作接口。框架将 HAL 库的硬件操作(如初始化、发送、接收)封装到 rt_uart_ops
接口中,并通过设备模型管理串口设备。上层应用可以通过标准的 rt_device
API 访问串口设备,完成数据收发和配置操作。后续可以通过DMA+环形缓冲区来优化。