你真的懂吗系列——串口通信

news2024/9/24 9:21:13

你真的懂吗

文章目录

  • 你真的懂吗
  • 前言
  • 二、什么是串口通信
  • 二、STM32的串口
  • 三、什么是数据通信


前言

串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。尽管比字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。

二、什么是串口通信

串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。
在这里插入图片描述
先来看串口的数据结构图
在这里插入图片描述
在这里插入图片描述
起始位: 起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。数据位: 数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。奇偶校验位: 奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。

假设数据字节为 01010101(二进制形式),其1的个数是4(偶数)。
偶校验:
校验位应为0,使得总的1的个数(4 + 0)保持偶数。
奇校验:
校验位应为1,使得总的1的个数(4 + 1)变成奇数。

停止位: 停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。

二、STM32的串口

先来看框图
在这里插入图片描述
编号1区域是时钟和波特率
可以看到有两个时钟域,usart_pclk 时钟域和usart_ker_ck 内核时钟域。
usart_pclk 是外设总线时钟,需要访问 USART 寄存器时,该信号必须有效。usart_ker_ck 是USART 时钟源,独立于 usart_pclk,由 RCC 提供。因此,即使 usart_ker_ck 时钟停止,也可以连续对 USART 寄存器进行读/写操作。

__HAL_RCC_USART1_CLK_ENABLE() 串口时钟使能

波特率寄存器 USART_BRR通过设置该寄存器就可以配置不同波特率
在这里插入图片描述
USART 保护时间和预分频器寄存器 (USART_GTPR)
USART 预分频器寄存器 (USART_PRESC)

波特率,即每秒钟传输的码元个数,在二进制系统中(串口的数据帧就是二进制的形式),波特率与波特率的数值相等,所以可以把串口波特率理解为每秒钟传输的二进制位数。(假设波特率设置为 9600 波特,这意味着每秒钟传输 9600 个符号。如果每个符号等于一个比特,那么比特率也就是 9600 比特每秒(bps)。在这种情况下,波特率的数值与比特率的数值相等,因为每个符号传输一个比特,没有其他编码方式。)
再来看编号2 是收发数据
有两个寄存器两个fifo
USART 双向通信需要的两个引脚:
TX:发送数据输出引脚。
RX:接收数据输入引脚。
USART_TDR 是 USART 发送数据寄存器,要发送什么数据,往这个寄存器里写即可,低 9位有效。如下图所示
在这里插入图片描述

USART_RDR 是 USART 接收数据寄存器,要接收什么数据,读这个寄存器里写即可,低 9位有效。
在这里插入图片描述
从上面两张图可以看出,USART_TDR和RDR 虽然是一个 32 位寄存器,但是只用了低 9 位(DR[8:0]),其他都是保留,TDR[8:0]为串口数据,具体多少位,由M[1:0]决定。
当我们需要发送数据的时候,往 USART_TDR 寄存器写入你想要发送的数据,就可以通过串口发送出去了。而当有串口数据接收到,需要读取出来的时候,我们则必须读取 USART_RDR寄存器,USART_RDR 寄存器使用与 USART_TDR 是完全一样的,只是一个用来接收,一个用来发送。
当使能校验位(USART_CR1 中 PCE 位被置位)进行发送时,写到 MSB 的值(根据数据的长度不同,MSB 是第 7 位或者第 8 位)会被后来的校验位取代。
当使能校验位进行接收时,读到的 MSB 位是接收到的校验位。)
这就是有时候大家使用串口助手的时候不小心点到了奇偶校验数据会乱码的原因。

USART_TDR和USART_RDR的低9位是否有效,通过USART 控制寄存器1(USART_CR1)的 M 位(M0:位 12,M1:位 28)设置:
7 位字符长度:M[1:0] =“10”
8 位字符长度:M[1:0] =“00”
9 位字符长度:M[1:0] =“01”
基本都是使用 8 位数据字长。这些在数据手册中其实都有写
在这里插入图片描述
在这里插入图片描述

再来看编号3控制寄存器

通过控制寄存器控制 USART 数据的发送、数据接收、各种通信模式的设置、中断、DMA 模式还有唤醒单元等
STM32H7的每个串口都有 3 个控制寄存器 USART_CR1~3,串口的很多配置都是通过这3 个寄存器来设置的。USART_CR1 寄存器如图所示:
在这里插入图片描述
M[1:0]位(位 28 和 12),用于设置字长,我们一般设置为:00 表示 1 个起始位,8 个数据位,n 个停止位(n 的个数,由 USART_CR2 的[13:12]位控制)。OVER8 为过采样模式设置位,我们一般设置位 0,即 16 倍过采样已获得更好的容错性;UE 为串口使能位,通过该位置 1,以使能串口;PCE 为校验使能位,设置为 0,则禁止校验,否则使能校验;PS 为校验位选择位,设置为 0 则为偶校验,否则为奇校验;TXEIE 为发送缓冲区空中断使能位,设置该位为 1,当 USART_ISR 中的 TXE 位为 1时,将产生串口中断;TCIE 为发送完成中断使能位,设置该位为 1,当 USART_ISR 中的 TC 位为 1 时,将产生串口中断;RXNEIE 为接收缓冲区非空中断使能,设置该位为 1,当 USART_ISR 中的 ORE 或者RXNE 位为 1 时,将产生串口中断;TE 为发送使能位,设置为 1,将开启串口的发送功能;RE为接收使能位,用法同 TE。
在这里插入图片描述
在这里插入图片描述
这些在数据手册中都有提到
状态寄存器 USART_ISR
在这里插入图片描述

RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取USART_RDR,通过读 USART_RDR 可以将该位清零,也可以向该位写 0,直接清除。
在这里插入图片描述

TC(发送完成),当该位被置位的时候,表示 USART_TDR 内的数据已经被发送完成了。
在这里插入图片描述

如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:
1)读 USART_ISR,写 USART_TDR。
2)向 ICR 寄存器的 TCCF 位写 1。
再来看编号4 DMA 和中断功能
USART 支持 DMA 传输,可以实现高速数据传输
在 USART 通信过程中,中断可由不同事件生成,同时支持 USART 模块生成唤醒中断。常用的中断比如:发送数据寄存器为空、发送 FIFO 未满、发送完成、接收 FIFO 非空、接收 FIFO 已满等。关于串口DMA可以看后面的文章。
最后看一下编号5USART 信号引脚
直接看数据手册中的描述即可,这些在232和485的文章会具体讲到
在这里插入图片描述

三、什么是数据通信

数据通信的方式一共有两种,串行通信和并行通信
在这里插入图片描述
串行通信的基本特征是数据逐位顺序依次传输,优点是传输线少成本低,抗干扰能力强可用于远距离传输,缺点就是传输速率低。而并行通信是数据各位可以通过多条线同时传输,优点是传输速率高,缺点就是线多成本就高了,抗干扰能力差因而适用于短距离、高速率的通信。
数据传输方向一共有三种 单工 半双工 全双工
在这里插入图片描述
单工是指数据传输仅能沿一个方向,不能实现反方向传输。
半双工是指数据传输可以沿着两个方向,但是需要分时进行。
全双工是指数据可以同时进行双向传输。
这里注意全双工和半双工通信的区别:半双工通信是共用一条线路实现双向通信,而全双工是利用两条线路,一条用于发送数据,另一条用于接收数据。
数据同步方式有两种 同步通信和异步通信
在这里插入图片描述同步通信要求通信双方共用同一时钟信号,在总线上保持统一的时序和周期完成信息传输。
优点:可以实现高速率、大容量的数据传输,以及点对多点传输。缺点:要求发送时钟和接收时钟保持严格同步,收发双方时钟允许的误差较小,同时硬件复杂。
异步通信不需要时钟信号,而是在数据信号中加入开始位和停止位等一些同步信号,以便使接收端能够正确地将每一个字符接收下来,某些通信中还需要双方约定传输速率。优点:没有时钟信号硬件简单,双方时钟可允许一定误差。缺点:通信速率较低,只适用点对点传输。
通信速率
在数字通信系统中,通信速率(传输速率)指数据在信道中传输的速度,它分为两种:传信率和传码率。
传信率:每秒钟传输的信息量,即每秒钟传输的二进制位数,单位为 bit/s(即比特每秒),因而又称为比特率。
传码率:每秒钟传输的码元个数,单位为 Baud(即波特每秒),因而又称为波特率。
比特率和波特率这两个概念常常被混淆。比特率很好理解,我们来看看波特率,波特率被传输的是码元,码元是信号被调制后的概念,每个码元都可以表示一定 bit 的数据信息量。举个例子,在 TTL 电平标准的通信中,用 0V 表示逻辑 0,5V 表示逻辑 1,这时候这个码元就可以表示两种状态。如果电平信号 0V、2V、4V 和 6V 分别表示二进制数 00、01、10、11,
这时候每一个码元就可以表示四种状态。
由上述可以看出,码元携带一定的比特信息,所以比特率和波特率也是有一定的关系的。

比特率 = 波特率 * log2M

举个例子:波特率为 100 Baud,即每秒传输 100 个码元,如果码元采用十六进制编码(即M=16,代入上述式子),那么这时候的比特率就是 400 bit/s。如果码元采用二进制编码(即 M=2,代入上述式子),那么这时候的比特率就是 100 bit/s。(这个时候再来回顾一下前面讲的波特率就很明白了,采用二进制的时候,波特率和比特率数值上相等。)

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

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

相关文章

机器学习算法-决策树算法

文章目录 什么是决策树?决策树的基本概念决策树的构建过程决策树的优缺点优点:缺点: 决策树的优化决策树的应用决策树的实现工具 特征选择准则1. 信息增益(Information Gain)计算公式:熵(Entrop…

ubuntu20.4安装Qt5.15.2

ubantu20.4镜像下载地址: https://releases.ubuntu.com/focal/ubuntu-20.04.6-desktop-amd64.iso Qt5.15.2下载地址: https://download.qt.io/official_releases/online_installers/ 安装步骤 1、进入地址后选择对应安装包,我这是ubuntu…

Redis进阶(二)--Redis高级特性和应用

文章目录 第二章、Redis高级特性和应用一、Redis的慢查询1、慢查询配置2、慢查询操作命令3、慢查询建议 二、Pipeline三、事务1、Redis的事务原理2、Redis的watch命令3、Pipeline和事务的区别 四、Lua1、Lua入门(1)安装Lua(2)Lua基…

虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天

SETUP:工具和插件 工具:elevenlabs或者讯飞,用于Speech Synthesis(语音合成,text to speech)。 https://elevenlabs.io/app/speech-synthesis/text-to-speechhttps://elevenlabs.io/app/speech-synthesis…

海外云手机——跨国业务的高效工具

海外云手机是一种基于云计算的虚拟手机服务,依托海外服务器实现跨国网络访问。这项服务不仅具备传统智能手机的所有功能,还突破了地域限制,为跨国业务提供更加便捷、高效、安全的解决方案。 随着全球化的加速和互联网的快速普及,跨…

C语言深入理解指针五(18)

文章目录 前言一、回调函数是什么?二、qsort使用举例使用qsort函数排序整型数据使用qsort函数排序结构数据 三、qsort的模拟实现总结 前言 本篇将会很有意思! 一、回调函数是什么? 回调函数就是一个通过函数指针调用的函数。   如果你把函数…

代码随想录27期|Python|Day52|​动态规划|​647. 回文子串|516. 最长回文子序列

本文是动态规划的回文字符串部分。 647. 回文子串 本题需要搞清楚dp的定义、遍历顺序和递推公式。 1、dp数组的定义 由图片可知,不同于之前的dp数组直接定义为当前遍历到的位置处题目所要求得值,而是应该定义为i为开始,j为结束的子串是否是…

探索音视频SDK的双重核心:客户端与服务端的协同作用

在当今的数字化时代,音视频技术已成为连接人与人、人与世界的重要桥梁。从社交娱乐到在线教育,从远程医疗到视频会议,音视频技术的应用无处不在,极大地丰富了我们的生活方式和工作模式。本文将深入探讨音视频SDK的两大核心类别——…

横版闯关手游【全明星时空阿拉德】Linux手工服务端+运营后台+双app端

横版闯关手游【时空阿拉德】(【全明星阿拉德】)阿拉德系列2022整理Linux手工服务端余额充值后台安卓苹果双端。 运营后台看目录结构是thinkphp开发的。 代码免费下载:百度网盘

DNAT和SNAT实践

NAT分SNAT和DNAT两种。从名字上区分: SNAT将源IP地址替换为出口网络的IP地址,以便内网地址可以访问外网服务。一般受限于公网IP有限,一个内网集合想访问外网服务,则用统一的出口做代理。出口配置公网IP,帮助从此发出的…

Java重修笔记 第五十四天 坦克大战(二)常用的绘图方法、画出坦克图形

常用的绘图方法 1.设置当前画笔的颜色,可多次调用 public abstract void setColor(Color c) 参数:c -颜色 2. 画一条直线 public abstract void drawLine(int x1, int y1, int x2, int y2) 参数:x1 - 第一个点的 x坐标。 y1 - 第一点的 y坐…

Git使用—把当前仓库的一个分支push到另一个仓库的指定分支、基于当前仓库创建另一个仓库的分支并推送到对应仓库(mit6828)

目录 背景提示 将当前仓库的一个分支push到另一个仓库的指定分支 直接基于仓库rep1中的某个分支创建新的分支并将其推送到目标仓库rep2 补充 参考链接 背景提示 最近打算做一下mit6.828的项目,这个仓库使用问题困扰了自己一段时间,由于6828官方提供…

92、K8s之ingress下集

一、ingress 1.1、两种部署方式 1、ingress------------deployment nodeport ​ daemonset hostnetwork----每台设备只能有一个pod,因为直接使用宿主机的端口,所以只能开启一个pod。 2、ingress------svc------deployment里面的pod,这种…

文件IO编程

文章目录 文件描述符相关系统调用文件有关的系统调用文件操作函数--creat函数文件操作函数--open函数文件操作函数--read函数文件操作函数--write函数文件操作函数--close函数文件操作函数--lseek函数缓冲区的大小对性能的影响 实验:调用系统函数,实现文…

Linux:体系结构和操作系统管理

目录 一、冯诺依曼体系结构 1.问题1 2.问题2 二、操作系统管理 一、冯诺依曼体系结构 本章将会谈论一下对冯诺依曼计算机体系结构的理解。 在2024年,几乎所有的计算机,都遵守冯诺依曼体系结构。 冯诺依曼体系结构是应用在硬件层面的,而硬…

Docker高级管理--Compose容器编排与私有仓库(Docker技术集群与应用)

本文介绍了Docker的三大工具:Docker Machine用于创建和管理Docker主机,Docker Compose用于单引擎模式下的多容器应用部署和管理,而Docker Swarm则是一个集群管理工具,提供微服务应用编排功能。Docker Machine支持在不同环境配置Do…

【代码随想录训练营第42期 Day56打卡 - 图论Part6 - 并查集2 - 冗余连接问题

目录 一、做题心得 二、题目与题解 题目一:108. 冗余连接 题目链接 题解:并查集 题目二:109. 冗余连接II 题目链接 题解:并查集 三、小结 一、做题心得 冗杂连接问题是图论章节应用并查集的经典问题。所有的顶点通过边相…

Redis 篇- 实战项目中使用 Redis 实现经典功能(异步秒杀商品、点赞功能、共同关注的好友、投喂功能)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 使用 Redis 实现异步秒杀 1.1 基于 Lua 脚本判断是否符合条件:库存是否充足、一人一单 1.2 基于 Redis 中的 Stream 实现消息队列 1.3 使用 Java 操作…

Unity Hub自动安装指定版本Unity的Android开发环境

Unity开发Android环境要求SDK、DNK、JDK、Gradle版本都要对才能发布APK,自己去配置很容易出错。Unity Hub可以自动安装指定版本Unity的Android开发环境。 1.安装国内用的UnityHub(我这里用的3.3.2-c6) 2.找到对应的Unity版本 3.点击【从Unit…

docker管理redis集群

1.拉取redis镜像 docker pull redis拉取完成 [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest a617c1c92774 3 years ago 105MB2.运行redis容器 docker run -itd --name redis-test01 -p 6379:6379…