嵌入式中UART通信的方法

UART是一种异步全双工串行通信协议,由 Tx 和 Rx 两根数据线组成,因为没有参考时钟信号,所以通信的双方必须约定串口波特率数据位宽奇偶校验位停止位等配置参数,从而按照相同的速率进行通信。

异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。当波特率为 9600bps 时,传输一个 bit 的时间间隔大约为 104.16us;波特率为 115200bps 时,传输一个bit的时间间隔大约为 8us。

图片

数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。

数据通信时序图:

图片

其中各位的意义如下: 

起始位:先发出一个逻辑”0”信号,表示传输字符的开始;

数据位:可以是5~8位逻辑”0”或”1”;如ASCII码(7位),扩展BCD码(8位);小端传输,即LSB先发,MSB后发;

校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验);

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平(用于双方同步,停止位时间间隔越长,容错能力越强);

空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送;

注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。
 

图片

↑图-1 起始位和停止位

图片

↑图-2 数据位
 

图片

↑传输“A”

上图是 uart 协议传输一个”A” 字符通过示波器的uart解码而得到的波形示意图。根据此图来介绍一下 uart 的一些基本参数。 
波特率:此参数容易和比特率混淆,其实他们是有区别的。但是我认为 uart 中的波特率就可以认为是比特率,即每秒传输的位数(bit)。一般选波特率都会有9600、19200、115200 等选项。其实意思就是每秒传输这么多个比特位数(bit)。 
起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。 
数据位:可以选择的值有 5,6,7,8 这四个值,可以传输这么多个值为 0 或者 1 的bit位。这个参数最好为8,因为如果此值为其他的值时当你传输的是 ASCII 值时一般解析肯定会出问题。理由很简单,一个ASCII字符值为8位,如果一帧的数据位为7,那么还有一位就是不确定的值,这样就会出错。 
校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。就比如传输 “A”(01000001) 为例。 
1、当为奇数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验)。图-1的波形就是这种情况。 
2、当为偶数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验)。 
此位还可以去除,即不需要奇偶校验位。 
停止位:它是一帧数据的结束标志。可以是 1bit、1.5bit、2bit 的空闲电平。可能大家会觉得很奇怪,怎么会有1.5位~没错,确实有的。所以我在生成此 uart 信号时用两个波形点来表示一个bit。这个可以不必深究。。。 
空闲位:没有数据传输时线路上的电平状态。为逻辑 1。 
传输方向:即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。比如传输 “A” 如果是 MSB 那么就是 01000001(如图-2),如果是 LSB 那么就是10000010(如下图的图-4) 
uart 传输数据的顺序就是:刚开始传输一个起始位,接着传输数据位,接着传输校验位(可不需要此位),最后传输停止位。这样一帧的数据就传输完了。接下来接着像这样一直传送。在这里还要说一个参数。 
帧间隔:即传送数据的帧与帧之间的间隔大小,可以以位为计量也可以用时间(知道波特率那么位数和时间可以换算)。比如传送”A”完后,这为一帧数据,再传”B”,那么A与B之间的间隔即为帧间隔。 

图片

 ↑图-3

图片

 ↑图-4

上两图和下两图传送的数据和波特率都是一样的,但是有几个参数是故意设置反了从而形成对比。有助于更深入的理解UART。 

图片

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

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

相关文章

插值(一)——多项式插值(C++)

插值 插值的作用是可以将原本比较难计算的函数转换为误差在一定范围内的多项式,比如在单片机中直接计算 x 、 log ⁡ 2 x \sqrt{x}、\log_2x x ​、log2​x之类的函数是比较麻烦的,但是使用插值的方法就可以将其转换为误差可控的只有乘法和加减法的多项…

MySQL学习记录——팔 函数

文章目录 1、日期函数2、字符串函数3、数学函数4、其它函数 1、日期函数 //获取日期 select current_date(); //获取时间 select current_time(); //获取时间戳, 格式为日期时间 select current_timestamp(); //获取当前时间, 格式为日期时间 select now(); //获取参数的日期部…

Leetcode-1572. 矩阵对角线元素的和

题目: 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3],[4,5,6],[7,8,9]] 输出:25 解释:对角线…

RK3568笔记十六:Framebuffer实验

若该文为原创文章,转载请注明原文出处。 本意是移植LVGL,但在编译DRM过程中一直编译失败,然后就想Framebuffer是否可以用,所以测试一下。 一、framebuffer介绍 FrameBuffer中文译名为帧缓冲驱动,它是出现在2.2.xx内…

leetcode(二分查找)34.在排序数组中查找元素的第一个和最后一个位置(C++详细解释)DAY11

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计…

SECS/GEM的HSMS通讯?金南瓜方案

High Speed SECS Message Service (HSMS) 是一种基于 TCP/IP 的协议,它使得 SECS 消息通信更加快速。这通常用作设备间通信的接口。 HSMS 状态逻辑变化(序列): 1.Not Connected:准备初始化 TCP/IP 连接,但尚…

【C深度解剖】取模与取余

简介:本系列博客为C深度解剖系列内容,以某个点为中心进行相关详细拓展 适宜人群:已大体了解C语法同学 作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正 作…

mac安装openjdk

解压 linxiang192 ~ % cd /Users/linxiang/Work linxiang192 Work % ls -all total 379032 drwxr-xr-x 7 linxiang staff 224 2 15 17:10 . drwxr-x--- 27 linxiang staff 864 2 15 17:16 .. -rw-r--r-- 1 linxiang staff 6148 2 15 17:10 .DS_…

SpringCloud之Nacos用法笔记

SpringCloud之Nacos注册中心 Nacos注册中心nacos启动服务注册到Nacosnacos服务分级模型NacosRule负载均衡策略根据集群负载均衡加权负载均衡Nacos环境隔离-namespace Nacos与eureka的对比临时实例与非临时实例设置 Nacos配置管理统一配置管理微服务配置拉取配置自动刷新远端配置…

1903. 字符串中的最大奇数【简单】

1903. 字符串中的最大奇数 题目描述 给你一个字符串 num ,表示一个大整数。请你在字符串 num 的所有 非空子字符串 中找出 值最大的奇数 ,并以字符串形式返回。如果不存在奇数,则返回一个空字符串 "" 。 子字符串是字符串中的一个…

你好,C++(14)用表达式表达我们的设计意图——4.1 用操作符对数据进行运算

第4章 将语句编织成程序 学过C中的各种数据类型, 就知道如何使用各种数据类型定义变量来描述现实世界中的各种事物了。现在,我们可以将一个工资统计程序大致写成下面这个样子: // 工资统计程序 int main() {// 表示员工个数的常量NUMconst i…

1232.缀点成线(Java)

题目描述: 给定一个数组 coordinates ,其中 coordinates[i] [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。 输入: coordinates [[1,2],[2,3],[3,4],[4,5]…

(力扣记录)102. 二叉树的层序遍历

数据结构:树🌲 时间复杂度:O(n) 空间复杂度:O(n) 代码实现: class Solution:def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []res []q [root]while q:curr []for…

机器学习:数据集划分笔记

数据集划分是机器学习中非常关键的步骤,能直接影响模型的训练效果和泛化能力。它的主要目的是为了评估模型对新数据的泛化能力,即模型在未见过的数据上能表现良好。 数据集通常被划分为三个部分:训练集(Training set)、…

Spring boot整合redisson报错

Spring boot整合redisson报错 org.redisson.client.RedisConnectionException: Unable to connect to Redis server: localhost/127.0.0.1:6379 原因 原因是计算机连接不上redis导致的 解决方案 重启redis 在redis文件目录下打开cmd 1.检查redis是否在运行 redis-cli p…

AutoSAR(基础入门篇)9.5-实验:配置通信

目录 一、为通信创建Ports 二、Data Mapping 三、Task Mapping 四、实验总结 终于到了实验篇了,前面的通信内容大家可能看的有点懵,这里确实没什么好的讲解顺序,所以博主自己也觉得讲的有点乱。但是不要紧,前面讲的通信的内容基本上大家很难用到。特别是对于初学者来说…

问题:实行网络化管理,为此需要做好以下几个方面的工作。() #知识分享#其他#职场发展

问题:实行网络化管理,为此需要做好以下几个方面的工作。() A、建立“公共部门—私人部门—第三部门”的合作网络 B、采用平等协商、双向互动、共同参与的决策方式,参与式决策应当成为网络化管理中的主要决策方式 C、建立“公共部门—私人部…

vue axios 请求后端无法传参问题

vue请求后端无法传参问题 问题描述处理过程总结 问题描述 在学习vue时,使用axios调用后端,发现无法把参数正确传到后端,现象如下: 使用vue发起请求,浏览器上已经有传参,但是后端没接收到对应的用户名密码&…

算法之贪心

1.部分背包问题 代码1: 代码2: 但如果金币不能分割,那贪心就不是最优解,正确的做法是搜索或动态规划。 2.排队接水 3.在规定时间内参加最多的比赛 4.合并果子 使用memset初始化int数组时,第二个参数如果是0&#xff0…

Vue源码系列讲解——模板编译篇【五】(优化阶段)

1. 前言 在前几篇文章中,我们介绍了模板编译流程三大阶段中的第一阶段模板解析阶段,在这一阶段主要做的工作是用解析器将用户所写的模板字符串解析成AST抽象语法树,理论上来讲,有了AST就可直接进入第三阶段生成render函数了。其实…