访问串口设备

应用程序通过 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() 关闭设备

查找串口设备

应用程序根据串口设备名称获取设备句柄,进而可以操作串口设备,查找设备函数如下所示,

rt_device_t rt_device_find(const char* name);
参数 描述
name 设备名称
返回 ——
设备句柄 查找到对应设备将返回相应的设备句柄
RT_NULL 没有找到相应的设备对象
一般情况下,注册到系统的串口设备名称为 uart0,uart1等,使用示例如下所示:

#define SAMPLE_UART_NAME “uart2”
static rt_device_t serial; /* 串口设备句柄 /
/
查找串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);

打开串口设备

通过设备句柄,应用程序可以打开和关闭设备,打开设备时,会检测设备是否已经初始化,没有初始化则会默认调用初始化接口初始化设备。通过如下函数打开设备:

rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags);
参数 描述
dev 设备句柄
oflags 设备模式标志
返回 ——
RT_EOK 设备打开成功
-RT_EBUSY 如果设备注册时指定的参数中包括 RT_DEVICE_FLAG_STANDALONE 参数,此设备将不允许重复打开
其他错误码 设备打开失败
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 种:中断模式、轮询模式、DMA 模式。在使用的时候,这 3 种模式只能选其一,若串口的打开参数 oflags 没有指定使用中断模式或者 DMA 模式,则默认使用轮询模式。

以中断接收及轮询发送模式使用串口设备的示例如下所示:
#define SAMPLE_UART_NAME “uart2” /* 串口设备名称 /
static rt_device_t serial; /
串口设备句柄 /
/
查找串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);

/* 以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);

控制串口设备

通过控制接口,应用程序可以对串口设备进行配置,如波特率、数据位、校验位、接收缓冲区大小、停止位等参数的修改。控制函数如下所示:

rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg);
参数 描述
dev 设备句柄
cmd 命令控制字,可取值:RT_DEVICE_CTRL_CONFIG
arg 控制的参数,可取类型: struct serial_configure
返回 ——
RT_EOK 函数执行成功
-RT_ENOSYS 执行失败,dev 为空
其他错误码 执行失败
控制参数结构体 struct serial_configure 原型如下:

struct serial_configure
{
rt_uint32_t baud_rate; /* 波特率 /
rt_uint32_t data_bits :4; /
数据位 /
rt_uint32_t stop_bits :2; /
停止位 /
rt_uint32_t parity :2; /
奇偶校验位 /
rt_uint32_t bit_order :1; /
高位在前或者低位在前 /
rt_uint32_t invert :1; /
模式 /
rt_uint32_t bufsz :16; /
接收数据缓冲区大小 /
rt_uint32_t reserved :4; /
保留位 */
};
RT-Thread 提供的默认串口配置如下,即 RT-Thread 系统中默认每个串口设备都使用如下配置:

#define RT_SERIAL_CONFIG_DEFAULT
{
BAUD_RATE_115200, /* 115200 bits/s /
DATA_BITS_8, /
8 databits /
STOP_BITS_1, /
1 stopbit /
PARITY_NONE, /
No parity /
BIT_ORDER_LSB, /
LSB first sent /
NRZ_NORMAL, /
Normal mode /
RT_SERIAL_RB_BUFSZ, /
Buffer size */
0
}

若实际使用串口的配置参数与默认配置参数不符,则用户可以通过应用代码进行修改。修改串口配置参数,如波特率、数据位、校验位、缓冲区接收 buffsize、停止位等的示例程序如下:

#define SAMPLE_UART_NAME “uart2” /* 串口设备名称 /
static rt_device_t serial; /
串口设备句柄 /
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /
初始化配置参数 */

/* step1:查找串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);

/* step2:修改串口配置参数 */
config.baud_rate = BAUD_RATE_9600; //修改波特率为 9600
config.data_bits = DATA_BITS_8; //数据位 8
config.stop_bits = STOP_BITS_1; //停止位 1
config.bufsz = 128; //修改缓冲区 buff size 为 128
config.parity = PARITY_NONE; //无奇偶校验位

/* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */
rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);

/* step4:打开串口设备。以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);

/** 程序清单:这是一个 串口 设备使用例程* 例程导出了 uart_sample 命令到控制终端* 命令调用格式:uart_sample uart2* 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备* 程序功能:通过串口输出字符串"hello RT-Thread!",然后错位输出输入的字符
*/#include <rtthread.h>#define SAMPLE_UART_NAME       "uart2"/* 用于接收消息的信号量 */
static struct rt_semaphore rx_sem;
static rt_device_t serial;/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{/* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */rt_sem_release(&rx_sem);return RT_EOK;
}static void serial_thread_entry(void *parameter)
{char ch;while (1){/* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */while (rt_device_read(serial, -1, &ch, 1) != 1){/* 阻塞等待接收信号量,等到信号量后再次读取数据 */rt_sem_take(&rx_sem, RT_WAITING_FOREVER);}/* 读取到的数据通过串口错位输出 */ch = ch + 1;rt_device_write(serial, 0, &ch, 1);}
}static int uart_sample(int argc, char *argv[])
{rt_err_t ret = RT_EOK;char str[] = "hello RT-Thread!\r\n";/* 查找系统中的串口设备 */serial = rt_device_find("uart2");if (!serial){rt_kprintf("find %s failed!\n", "uart2");return RT_ERROR;}/* 初始化信号量 */rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);/* 以中断接收及轮询发送模式打开串口设备 */rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);/* 设置接收回调函数 */rt_device_set_rx_indicate(serial, uart_input);/* 发送字符串 */rt_device_write(serial, 0, str, (sizeof(str) - 1));/* 创建 serial 线程 */rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);/* 创建成功则启动线程 */if (thread != RT_NULL){rt_thread_startup(thread);}else{ret = RT_ERROR;}return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(uart_sample, uart device sample);

RTT设备和驱动(2)UART 设备相关推荐

  1. 《Linux总线、设备与驱动》USB设备发现机制

    http://blog.csdn.net/tankai19880619/article/details/11639185 说明:本分析基于mstar801平台Linux2.6.35.11内核,其他内核 ...

  2. RTT设备与驱动之PIN设备

    单片机的PIN有2个基本功能:GPIO和AFIO,其中gpio的常用功能: 1 输入:上拉.下拉.模拟.浮动 2 输出:上拉.下拉.推挽.开漏 3 中断:上升沿.下降沿.双沿.高电平.低电平触发 RT ...

  3. RT-Thread记录(十二、I/O 设备模型之UART设备 — 使用测试)

    从 UART 设备开始学会使用 RT-Thread I/O 设备模型 . 目录 前言 一.UART 设备操作 1.1 UART 设备控制块 1.2 UART 操作函数 1.2.1 查找 UART 设备 ...

  4. 从需求的角度去理解Linux系列:总线、设备和驱动

    <从需求的角度去理解Linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文章,也是从需求的角度去理解Linux系统软件的开篇.这是作者精心撰写的经验总结,希望嵌 ...

  5. linux设备驱动之总线、设备、驱动

    文章转载至多个地方,网上拼凑的一篇文章,说的好听一些的话那就叫自己总结的文章,只 是多次引用啊,哈哈,哎,不管了,反正这个有利用学习进步就好,这是重要的,文章转载过来要经过一篇大脑才能成为自己的,以后 ...

  6. Linux设备驱动:USB设备驱动

    1.Linux设备驱动 设备驱动时操作系统内核和机器硬件之间的接口,为应用程序屏蔽了硬件的细节,由一组函数和一些私有数据组成,结构体内包含设备驱动所需要的所有资源,即驱动器对象所拥有的属性及成员.应用 ...

  7. Linux设备驱动之UART驱动结构

    一.对于串口驱动Linux系统中UART驱动属于终端设备驱动,应该说是实现串口驱动和终端驱动来实现串口终端设备的驱动.要了解串口终端的驱动在Linux系统的结构就先要了解终端设备驱动在Linux系统中 ...

  8. linux设备驱动之串口移植,Linux设备驱动之UART驱动结构

    一.对于串口驱动Linux系统中UART驱动属于终端设备驱动,应该说是实现串口驱动和终端驱动来实现串口终端设备的驱动.要了解串口终端的驱动在Linux系统的结构就先要了解终端设备驱动在Linux系统中 ...

  9. RT-Thread | UART设备驱动框架解析

    1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! UART简介 STM32 芯片具有多个 USART 外设用于串 ...

最新文章

  1. 计算机缺失缺少mfc110.dll等相关文件的解决办法
  2. qt登录界面跳转_每天10分钟,木辛老师带你实战慕课软件开发:登录界面开发第2课...
  3. Surface Book 3现身3DMark:10nm架构升级
  4. EXP-00011: XX.tab does not exist
  5. linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
  6. 苹果7支持快充吗_iPhone12的磁吸无线充到底怎么回事?是否支持苹果20W快充?
  7. 微信小程序连续签到获得积分
  8. CDISC SDTM AE domain学习笔记 - 2
  9. 接口测试如何生成随机的参数值
  10. WPS文字设置奇偶页眉、下划线的方法步骤
  11. APP支付支付签名验证失败
  12. 阿里云服务搭建微信小程序开发环境
  13. 花 30 美金请 AI 画家弄了个 logo,网友:画得非常好,下次别画了!
  14. 电影院里电影票和座位号的关系
  15. Java图像处理(后面会补充PS啥的)
  16. 【NOIP2010普及组】三国游戏题解
  17. 阿里云国际站:java应用提速(速度与激情)
  18. 优雅简洁的通用排版利器:MarkDown(支持公众号、知乎等场景渲染)
  19. 腾云忆想构建云化IT生态,助力我国“双循环经济”数字化升级
  20. 【应届生笔试资料分享二】中国农业银行相关介绍汇总

热门文章

  1. 如何用eclipse将本地项目上传至github
  2. CNC精雕机的应用:玻璃精雕机可以加工什么呢?
  3. excel中显示隐藏的行_在Excel中显示或隐藏用户提示
  4. 【Python】学生成绩管理系统
  5. 关于计算机维修的文章,计算机维修与维护论文_相关文章专题_写写帮文库
  6. 机器学习-AdaBoost(自适应提升算法)
  7. 【反编译】安卓APK反编译为java文件
  8. 海康2018C++面试
  9. CentOS8 DNF的使用
  10. 计算机毕设Python+Vue医院病房管理系统(程序+LW+部署)