RT-Thread UART

UART 简介

UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。

UART 串口的特点是将数据一位一位地顺序传送,只要 **2 根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。**UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用 UART 串口通信的端口,这些参数必须匹配,否则通信将无法正常完成。UART 串口传输的数据格式如下图所示:

在这里插入图片描述
起始位:表示数据传输的开始,电平逻辑为 “0” 。

数据位:可能值有 5、6、7、8、9,表示传输这几个 bit 位数据。一般取值为 8,因为一个 ASCII 字符值为 8 位。

奇偶校验位:用于接收方对接收到的数据进行校验,校验 “1” 的位数为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。

停止位: 表示一帧数据的结束。电平逻辑为 “1”。

波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数 bit/s(bps)。常见的波特率值有 4800、9600、14400、38400、115200等,数值越大数据传输的越快,波特率为 115200 表示每秒钟传输 115200 位数据。

#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种模式只能选其1,若串口的打开参数oflags没有指定使用中断模式或者DMA模式,则默认使用轮询模式。

DMA(Direct Memory Access)即直接存储器访问。
DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过DMA控制器为RAM与I/O设备开辟一条直接传输数据的通路,这就节省了CPU的资源来做其它操作。
使用 DMA 传输可以连续获取或发送一段信息而不占用中断或延时,在通信频繁或有大段信息要传输时非常有用。

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

rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg);
  • dev:设备句柄
  • cmd:命令控制字,可取值:RT_DEVICE_CTRL_CONFIG
  • arg:控制的参数,可取类型:strcut 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;      /* 保留位 */
};/* 波特率可取值 */
#define BAUD_RATE_2400                  2400
#define BAUD_RATE_4800                  4800
#define BAUD_RATE_9600                  9600
#define BAUD_RATE_19200                 19200
#define BAUD_RATE_38400                 38400
#define BAUD_RATE_57600                 57600
#define BAUD_RATE_115200                115200
#define BAUD_RATE_230400                230400
#define BAUD_RATE_460800                460800
#define BAUD_RATE_921600                921600
#define BAUD_RATE_2000000               2000000
#define BAUD_RATE_3000000               3000000
/* 数据位可取值 */
#define DATA_BITS_5                     5
#define DATA_BITS_6                     6
#define DATA_BITS_7                     7
#define DATA_BITS_8                     8
#define DATA_BITS_9                     9
/* 停止位可取值 */
#define STOP_BITS_1                     0
#define STOP_BITS_2                     1
#define STOP_BITS_3                     2
#define STOP_BITS_4                     3
/* 极性位可取值 */
#define PARITY_NONE                     0
#define PARITY_ODD                      1
#define PARITY_EVEN                     2
/* 高低位顺序可取值 */
#define BIT_ORDER_LSB                   0
#define BIT_ORDER_MSB                   1
/* 模式可取值 */
#define NRZ_NORMAL                      0     /* normal mode */
#define NRZ_INVERTED                    1     /* inverted mode */
/* 接收数据缓冲区默认大小 */
#define RT_SERIAL_RB_BUFSZ              64

接收缓冲区:当串口使用中断接收模式打开时,串口驱动框架会根据RT_SERIAL_RB_BUFSIZE大小开辟一块缓冲区用于保存接收到的数据,底层驱动接收到一个数据,都会在中断服务程序里面将数据放入缓冲区。

#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                                      \
}

默认串口配置接收数据缓冲区大小为RT_SERIAL_RB_BUFSZ,即64字节。
若一次性数据接收字节数很多,没有及时读取数据,那么缓冲区的数据将会被新接收到的数据覆盖,造成数据丢失,建议调大缓冲区,通过control接口修改。
open设备之后,缓冲区大小不可更改。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/121053.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Error: Cannot find module ‘timers/promises‘

这个错误很要命 他会导致你本机所有的npm 命令全部报错 首先 这个错误是因为 npm 与 node版本不匹配导致的 最简单的办法就是 查一下你安装的这个npm 的版本适配那个版本的 node 然后将本地的node删除 控制面板写在node 然后去官方文档现在与本地npm 匹配的node.js 这样 你执行…

【LeetCode-中等题】146. LRU 缓存

文章目录 题目方法一:直接继承LinkedHashMap调用api方法二:自定义LinkedHashMap HashMap ListNode LinkedHashMap 题目 LRU缓存是什么:LRU缓存机制,你想知道的这里都有 实现 LRU 缓存算法 方法一:直接继承Linked…

彻底学会Unity从网上加载资源到场景

使用类WWW 该类实例化的对象可以存储多种多媒体资源,只需要在构造函数中附上可访问的资源链接 Unity 中,WWW 类用于实例化互联网上的资源,如文本、图像、音频和视频等。WWW 实例化的对象可以存储多种多媒体素材。以下是一些常见的例子&…

固定资产卡片乱怎么管理

固定资产卡片是记录公司固定资产信息的重要工具,如果管理不善,容易造成卡片混乱、数据错误等问题。 为了避免这种情况的发生,可以采取以下措施:  建立完善的资产管理制度,明确固定资产的分类、标准和使用情况&#x…

C# 中什么是重写(子类改写父类方法)

方法重写是指在继承关系中,子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中,方法重写是一种多态的表现形式,它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重…

热点探测技术架构设计与实践

1. 概述 说到热点问题,首先我们先理解一下什么是热点? 热点通常意义来说,是指在一段时间内,被广泛关注的物品或事件,例如微博热搜,热卖商品,热点新闻,明星直播等等,所以…

You must install at least one postgresql-client-<version> package

使用主机上的映射端口来连接到 PostgreSQL 数据库。例如,使用以下命令连接到数据库: psql -h localhost -p 5432 -U postgres出现下面的问题: 分析: 如果您在运行 psql 命令时遇到错误消息 You must install at least one pos…

应用案例 | 3D视觉引导解决方案汽车零部件上下料

Part.1 行业背景 三维视觉引导技术在国内外汽车零部件领域得到了广泛应用。随着汽车制造业的不断发展和创新,对于零部件的加工和装配要求越来越高,而三维视觉引导技术能够帮助企业实现更精确、更高效的零部件上下料过程。 纵览国外,部分汽车…

若依 MyBatis改为MyBatis-Plus

主要内容:升级成mybatis-plus,代码生成也是mybatis-plus版本 跟着我一步一步来,就可完成升级! 检查:启动程序,先保证若依能启动 第一步:添加依赖 这里需要在两个地方添加,一个是最…

软件游戏丢失d3dcompiler_47.dll怎么办?这个几个解决方法可修复

当我们在玩软件游戏时,有时候会出现丢失 d3dcompiler_47.dll 的问题,这让我们感到非常困扰。d3dcompiler_47.dll 是 DirectX 中的一个重要组件,如果它丢失了,那么很多游戏就无法正常运行。我将和大家分享一下我在解决软件游戏丢失…

计算机竞赛 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层:2.4 池化层:2.5 全连接softmax层:2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…

小白学go基础03-了解Go项目的项目结构

我们先来看看第一个Go项目——Go语言自身——的项目结构是什么样的。Go项目的项目结构自1.0版本发布以来一直十分稳定,直到现在Go项目的顶层结构基本没有大的改变。 截至Go项目commit 1e3ffb0c(2019.5.14),Go1.0 项目结构如下&am…

Ansible学习笔记15

1、roles:(难点) roles介绍: roles(角色):就是通过分别将variables,tasks及handlers等放置于单独的目录中,并可以便捷地调用他们的一种机制。 假设我们要写一个playbo…

KaTex用法

KaTeX是一个用于数学公式渲染的JavaScript库&#xff0c;可以在网页上方便地显示数学符号和公式。下面是KaTeX的使用方法&#xff1a; 在网页中引入KaTeX的CSS和JS文件&#xff1a; <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/Ka…

【真题解析】系统集成项目管理工程师 2023 年上半年真题卷(综合知识)

本文为系统集成项目管理工程师考试(软考) 2023 年上半年真题(全国卷),包含答案与详细解析。考试共分为两科,成绩均 ≥45 即可通过考试: 综合知识(选择题 75 道,75分)案例分析(问答题 4 道,75分)综合知识(选择题*75)1-10 题11-20 题21-30 题31-40 题41-50 题51-60 …

webpack(三)loader

定义 loader用于对模块的源代码进行转换&#xff0c;在imporrt或加载模块时预处理文件 webpack做的事情&#xff0c;仅仅是分析出各种模块的依赖关系&#xff0c;然后形成资源列表&#xff0c;最终打包生成到指定文件中。 在webpack内部&#xff0c;任何文件都是模块&#x…

VBA技术资料MF52:VBA_在Excel中突出显示前 10 个值

【分享成果&#xff0c;随喜正能量】一言之善&#xff0c;重于千金。善良不分大小&#xff0c;有时候你以为的一句话&#xff0c;小小的举手之劳&#xff0c;也可能就是别人的救赎&#xff01;不要吝啬你的善良&#xff0c;因为你永远不知道那小小的善良能给多少人带来光明。。…

大厂面试 | 百度一面,顶不住

题目来源&#xff1a;https://www.nowcoder.com/feed/main/detail/d39aabc0debd4dba810b4b9671d54348 前文 本期是【捞捞面经】系列文章的第 2 期&#xff0c;持续更新中…。&#xff08;更多与往期下方仓库直达&#xff09; 《捞捞面经》系列正式开始连载啦&#xff0c;据说看…

2023年7月婴幼儿辅食市场数据分析(京东商品数据)

随着人们对婴幼儿饮食健康的关注不断增加&#xff0c;市场对高品质、安全、营养丰富的辅食需求也日益旺盛。婴幼儿辅食市场增长放缓&#xff0c;但整体仍保持上升态势。鲸参谋数据显示&#xff0c;今年7月份&#xff0c;京东平台婴幼儿辅食市场的销量为1000万&#xff0c;同比增…

分布式环境下的数据同步

一般而言elasticsearch负责搜索&#xff08;查询&#xff09;&#xff0c;而sql数据负责记录&#xff08;增删改&#xff09;&#xff0c;elasticsearch中的数据来自于sql数据库&#xff0c;因此sql数据发生改变时&#xff0c;elasticsearch也必须跟着改变&#xff0c;这个就是…