首页 > 其他分享 >基于RT_Thread的UART

基于RT_Thread的UART

时间:2024-11-16 16:19:00浏览次数:3  
标签:RT rt Thread UART 串口 device 设备

        前言:基于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+环形缓冲区来优化。

标签:RT,rt,Thread,UART,串口,device,设备
From: https://blog.csdn.net/nnld1/article/details/143817970

相关文章

  • JUC---多线程下的数据共享(基于ThreadLocal的思考)
    多线程下的数据共享(基于ThreadLocal的思考)起初实在写项目过程中,在完成超时订单自动取消的任务时,使用xxl-job,整个逻辑是需要从订单表中找出过期的订单,然后将其存入订单取消表。存入订单取消表时需要存储用户的信息。我最开始没想那么多,就直接从ThreadLocal中取出用户信息,但......
  • Android平台如何拉取RTSP|RTMP流并转发至轻量级RTSP服务?
    技术背景好多了解我们模块的开发者都知道,我们有非常成熟的轻量级RTSP服务模块,可以采集摄像头或屏幕的数据,编码打包注入Android平台的轻量级RTSP服务模块,让Android设备端,充当个类似于网络摄像头的角色,对外提供个RTSP拉流的URL,实现内网环境下的无服务部署直播场景,这种在内网监控......
  • Let'sGoFurther - Chapter 6: SQL Migrations
      InstallingthemigratetoolTomanageSQLmigrationsinthisprojectwe’regoingtousethemigratecommand-line tool(whichitselfiswritteninGo).OnLinuxandWindows,theeasiestmethodistodownloadapre-builtbinaryandmove ittoalocat......
  • 4.APM32-USART-串口接发
    效果展示USART-串口接发硬件原理图我们使用的开发板上没有USB转串口的芯片,如果要连接到电脑上还需要使用USB转串口的模块或者jlink自带的虚拟串口。开发板的PA9(TX)引脚接USB转串口模块的RX引脚,开发板的PA10(RX)引脚接USB转串口模块的TX引脚,同时双方的GND还要连起......
  • Virtual Box 虚拟机扩容
    VirtualBox虚拟机扩容扩容有风险,有可能导致磁盘损坏,系统不可用。需要使用的工具gpartedGParted--Afreeapplicationforgraphicallymanagingdiskdevicepartitions步骤图解1.扩大虚拟硬盘的容量2.加载分区工具执行分区操作3.扩展逻辑卷要扩大/分......
  • 「AI Infra 软件开源不是一个选项,而是必然」丨云边端架构和 AI Infra专场回顾@RTE2024
      在人工智能和开源技术蓬勃发展的当下,AIInfra项目正经历着日新月异的变革。从跨平台运行时到云边端AI基础设施,再到多模态知识助手,创新浪潮席卷而来。这些进步不仅显著提升了技术指标,也为实时音视频处理、边缘计算、大模型应用等场景开辟了新的可能性。 在RTE2024......
  • GOAT‘S AI早鸟报Part4
    欢迎后台......
  • [USACO19DEC] Moortal Cowmbat G
    前言很可惜,离场切不远多练练\(\rm{dp}\)吧算法简化题意给定一长为\(n\)的字符串\(S\),由前\(m\)个小写字母构成,现在要求将这个字符串变换成一个由至少连续\(k\)个相同字符构成的字符串组成的字符串(下称为合法字符串),其中,字符\(a\tob\)的花费为\(......
  • QT中使用图表之QChart绘制饼图
    饼图没有坐标轴,也不需要坐标轴使用的系列是QPieSeries饼图里面一个一个的块称为切片举例:绘制一个饼图,点击对应切片可以让切片分离1、创建图表视图并开启抗锯齿//1、创建图表视图QChartView*view=newQChartView(this);//开启抗锯齿view->setRenderHint(QPainte......
  • (ex)CRT / (ex)Lucas
    以下所有分数默认取整。CRT有\(\begin{cases}x\equiva_1\pmod{p_1}\\x\equiva_2\pmod{p_2}\\\cdots\\x\equiva_n\pmod{p_n}\end{cases}\),且所有\(p\)互质。令\(p'_i=\dfrac{\prodp}{p_i}\),且\(p'_i\)在\(\bmodp_i\)意义下逆元为\(q_i\),则......