STM32单片机学习(12)——串口通信相关概念
文章目录通信的概念STM32F103C8T6支持的通信协议串口相关概念串行通信串行通信实现数据传输的方式同步和异步串行通信时序的概念(重要)数据帧的概念异步串行通信同步串行通信具体通信分类串行通信接口和串口UART和USART通信的概念从本章节开始我们将正式学习单片机与外部硬件之间的通信方式。在此之前先来了解一些通信相关的基础概念。通信是指两个或多个设备之间通过某种传输媒介如导线、光纤或无线电波等进行信息交换的过程。通信的核心目的在于将数据从发送方传递到接收方并确保接收方能够正确接收和理解这些数据。通信的基本要素有发送方Transmitter产生并发送数据的设备。接收方Receiver接收并处理数据的设备。传输媒介Medium数据传递的通道如电线、光纤、空气无线通信。数据Data需要传递的信息可以是文本、数字、图像、音频等。通信协议Protocol通信双方约定的规则用于确保数据能够被正确传输和解析。通信协议定义了数据的格式、传输顺序、速率、错误检测与纠正方法等内容。可以看到在通信的各个要素中通信协议是核心。只需要通信双方遵循同一套通信协议并配合合适的硬件以及传输介质就可以实现设备间数据通信了。从工程实践的角度来看单片机开发的很大一部分工作都体现在通信的实现与调试上。你掌握的通信协议越多单片机就能连接和使用更多的外部硬件整个单片机系统的功能也就越强大。因此学习和掌握各种通信协议是单片机开发中一项非常重要、也是绕不开的核心内容。当然不同的单片机能够支持的通信协议是不同的我们使用的C8T6单片机支持哪些通信协议呢STM32F103C8T6支持的通信协议STM32F103C8T6中集成了很多用于通信的外设模块如下所示通信协议名/单片机外设名引脚双工设备应用场景USARTTX、RX全双工点对点单片机与PC通信、GPS模块、WIFI/蓝牙模块I2CSCL、SDA半双工多设备传感器、显示屏SPISCLK、MOSI、MISO、CS全双工多设备Flash存储器、显示屏、高速ADC/DACCANCAN_H、CAN_L半双工多设备汽车电子、工业控制、机器人USBDP、DM半双工点对点PC外设、存储设备、手机通信表格第一列的名字既是一种通信协议的名称也是单片机的一个外设模块名称。如USART既是单片机一个外设模块名也是一种通信协议名。表格第二列的引脚名指的是单片机进行该通信时的需要使用的引脚名具体的内容在讲解对应通信协议时再详谈。表格第三列有一个“双工”的概念下面解释一下双工这个概念单工通信数据只能单向传输类似广播发送端只能发送接收端只能接收。半双工通信数据可以双向传输但不能同时进行类似对讲机双方轮流充当发送端和接收端。全双工通信数据可以同时双向传输类似电话双方可以同时充当发送端和接收端。在当前章节中我们先学习第一种最简单、最基本其实也是最常用的通信协议——USART串口通信协议。同时我们也会完成第一个基本的通信实验——PC与单片机的双向数据通信。通过该实验帮助大家建立对通信的直观认识为后续学习 I2C、SPI等通信打下基础。串口相关概念为了避免**“迷迷糊糊就把概念学完了代码写完了然后迷迷糊糊的就实现功能了”**这种情况的出现我们还是要讲解一些基本的概念。理解概念可以使得基础更加牢固后续学习提升、与人沟通交流、面试才能够更加得心应手也能学得更明白。所以概念虽然很枯燥无趣看起来也不怎么影响写代码但仍然需要给予足够的重视。后续每学习一种新的通信总是从学习概念开始刚开始这些概念可以大体看一下不用求甚解。但一定要在学完这种通信后再回顾复习一下这些概念大概率都会“温故而知新”。串行通信在学习具体通信协议之前我们首先需要了解串行通信的基本概念。所谓串行通信指的是将数据一位一位一个bit一个bit地按照顺序在一条传输线上进行传输同一时刻只能传输1个bit位。数据在存储和处理时通常以1个字节8位为最小基本单位一次性存储处理1个字节的数据这种形式被称之为**“并行存储”**。而串行通信时数据是串行发送的。所以在串行通信的过程中发送端会将原本以并行形式存在的二进制数据按照通信协议规定的顺序逐位发送出去。这个过程称之为“并转串”。接收端接收到逐位传输的串行数据后再依照通信协议将其重新组合为适合计算机内部处理的并行数据。这个过程称之为“串转并”。理解了串行通信的数据传输方式后就可以总结出它的一些优势硬件实现简单成本相对低廉只需要简单的接收线和发送线以及一些控制信号线就可以实现串行通信。抗干扰性强可靠性强由于数据是逐位传输的即便传输过程中出现了干扰这些干扰也往往会集中在某一位上比较容易检测和纠正错误提高了数据传输的可靠性。但缺点也很明显数据需要一位一位地传输比起直接的并行通信传输数据传输速度相对较慢。总得来说串行通信方式虽然通信速率相对较慢但简单可靠、成本低廉是嵌入式系统中最常用的通信方式。STM32F10x系列单片机支持的五种通信协议USART、I2C、SPI、CAN、USB都是基于串行通信的通信协议。串行通信实现数据传输的方式在串行通信过程中数据总是以1 个比特位bit为单位依次进行发送和接收。那么具体到嵌入式系统中这1 个 bit 的数据究竟是如何被传输的呢换句话说通信过程中是如何区分当前发送的数据是 1还是 0的结合前面关于数字电路和 GPIO 的相关知识相信大家已经能够得出答案。从单片机的角度来看串行通信中的每一个 bit本质上就是通过引脚的电平状态来表示的引脚输出高电平表示发送一个 bit 数据 1引脚输出低电平表示发送一个 bit 数据 0因此串行通信的本质过程站在单片机的视角就是单片机引脚在高电平和低电平之间不断切换就能够将数据发送出去。实际上就是引脚的输出模式。单片机检测引脚输入的电平状态来判断当前接收到的 bit 是 1 还是 0。实际上就是引脚的输入模式。当然与单片机通信的另一个设备也是类似只是作为单片机开发我们通常不考虑它的实现。同步和异步串行通信上面提到了USART、I2C、SPI、CAN、USB都是基于串行通信的通信方式它们又可以进一步分为两类异步串行通信同步串行通信下面简单了解一下这两类不同的串行通信方式只做基本了解即可具体的细节还需要学到这些通信协议后再详谈。时序的概念(重要)对于通信而言时序是一个非常重要的概念。在我们学习各种通信协议的文档、技术文章和教学视频中时序几乎无处不在在日常的技术交流中也经常被提及。因此在正式学习具体通信协议之前有必要先对时序这一概念进行说明。所谓时序指的是随着时间的推进某一个时刻下或者某一段时间内通信系统中应当会发生哪些行为。说人话就是时序由通信双方约定好在什么时间就做什么事情。例如在某一次通信过程中随着时间推进双方按照约定可能发生下面事情在这一个时刻通信开始了。在这一时刻发送端发送了1位bit数据。…在某一个时刻通信结束了。如果将上述随时间推进而发生的一系列事件用图形的方式直观地表示出来这种图就称为时序图。在学习通信协议的过程中分析和理解时序图是非常重要的能力。看懂时序图是学习某种通信的基本要求。数据帧的概念数据帧就是通信协议中规定的“一次完整数据传输的基本单位”。或者换一种说法数据帧就是在一串连续的 bit 流中用来明确标记 “从哪里开始、到哪里结束”的一段结构化数据。说人话就是在串行通信中数据的收发肯定不可能以单个 bit 为单位进行而是以数据帧为基本单位进行的。发送端一次最少发1个数据帧称之为发送了“1帧数据”。同时接收端一次最少也会接收1帧数据。一个数据帧通常由多个 bit 位组成而不同的通信协议其数据帧的具体格式和组成方式也会有所不同。异步串行通信异步串行通信的基本特点如下异步串行通信的最大特点是通信双方不需要共享同一个时钟信号没有时钟信号这个统一的“指挥中心”。时钟信号可以简单理解成工作节奏信号共享时钟信号就意味着工作的节奏一致这就是同步否则就是异步。说人话就是异步串行通信的过程中没有指挥中心双方可以不同时收发数据允许一定程度的延时通信。既然不需要统一时钟信号异步串行通信在硬件接线时不需要额外的时钟信号线来统一时钟信号。虽然通信双方不共享时钟但必须事先约定相同的波特率。关于波特率是什么为什么要统一波特率在后面的小节会专门讲解。如果把通信看成写信给对方那么约定好波特率就相当于约定好语言以及文字大小这样对方才能看懂这封信。波特率的统一是异步串行通信的双方可以正确解析数据成功实现通信的关键。在异步串行通信中通信双方还需要约定一套关于数据格式的规则也就是需要统一数据帧格式。由于通信双方不共享时钟信号接收端无法依赖时钟来判断数据边界。所以双方会约定好数据帧的开始和结束标志接收端可以依靠这些标志判断通信的开始和结束。数据帧格式的其它方面也需要提前约定好这些约定通信双方必须遵守否则通信就会失败。正是由于统一了波特率约定了数据帧格式在异步串行通信中接收端即便不立刻同步处理接收数据数据通常也不会立刻丢失。如果接收端无法立刻处理数据这些数据通常会暂时缓存在接收端的内部寄存器当中。当然如果发送端持续高速发送而接收端处理过慢或者干脆不处理数据仍然会丢失。异步串行通信的时序没有时钟信号统一控制需要基于双方的约定由双方各自控制时序。异步串行通信其通信过程没有统一时钟信号约束仅由一系列规则约定那么时序的控制就由双方各自控制。当然自行控制时序不是乱来异步串行通信的时序由双方约定的规则控制。好比我们约定好9点碰面那我来了你也要来了双方做什么事情还是有统一约定的。如果想要用一句话来总结异步串行通信可以用这样的一句话异步串行通信的本质是在不共享时钟信号的情况下通过约定通信规则来完成数据传输其通信时序由通信双方各自独立控制。下面举一个生活中写信交流的场景来类比一下异步串行通信。写信时异步串行通信1. 不需要一边写另一边马上读写信和读信不需要完全同时进行。2. 需要统一语言且字不能写太大也不能太小否则影响辨认。 3. 约定好信的开头和结尾等格式双方都能够识别信件内容。 4. 写信和读写可以不同时但长时间不读信信件容易丢失。5. 按照约定规则双方完成写信或读写。但写信读信都是各自独立完成的不会受某种因素统一控制。1. 双方不共享时钟信号不需要同时“在线”通信。 2. 统一波特率否则通信双方无法正确解析数据。3. 约定好起始和终止条件双方都知道通信的开始和结束。 4. 通信允许不同时进行允许延时通信。但接收端长时间不接收数据可能发生数据丢失。 5. 时序是双方独立、各自控制的。同步串行通信同步串行通信的基本特点如下同步串行通信的最大特点是通信双方必须共享同一个时钟信号通信要求双方同时在线、实时配合。时钟信号可以理解为“工作的节奏信号”在同步串行通信中发送端和接收端完全按照同一个节奏工作。由于共享时钟信号通信双方在发送和接收数据时通常是严格同时同步进行的在时间上是完全对齐的。在硬件连接上同步串行通信通常需要额外的时钟信号线用于在通信过程中统一时钟信号。说人话就是通信双方就像一起跳双人舞双方都跟着时钟信号这个“音乐节拍”这样大家都不会跳错。同步串行通信的时序依靠时钟信号统一控制而不是各自独立控制。异步串行通信的时序由双方约定各种规则后由双方各自独立控制自身时序。但同步串行通信的时序则由共享的时钟信号统一控制。举一个例子异步串行通信就像双方约会约定好 9 点集合于是双方各自按照约定各自行动在 9 点的时候碰面。而同步串行通信则更像双方上班公司规定 9 点上班此时双方的行为就由公司规定来进行约束控制了。这就是时序控制权是由通信双方在约定规则后各自独立控制还是由共享的时钟信号进行统一约束和控制的区别。在同步串行通信中通信的各个重要节点双方行为都由时钟信号规定。在同步串行通信中时钟信号约束和指导双方通信的过程双方需要在约定好的时钟信号下各自完成通信动作。就像大家一起喊121…121…的干活1的时候做一个动作2的时候做一个动作然后重复这就是统一时钟信号的作用。如果想要用一句话来总结同步串行通信可以用这样的一句话同步串行通信的本质是用共享的时钟信号对通信双方的每一个时间行为进行严格约束时序严格固定。同步串行通信可以想象成你和朋友一起跳一段双人舞跳双人舞的特点同步串行通信的特点1. 双方必须同时在场总不能一个人跳双人舞。 **双方必须跟着同一个音乐节拍跳。2. ** 每一个动作都有明确的时间点由音乐节拍规定。3. 双方都不能自由发挥。 4. 双方必须配合节拍一方的不配合或失误都会导致整体失败。1. 通信双方必须同时在线实时配合。 由统一的时钟信号约束通信行为。 2. 通信行为有明确的时间点由时钟信号约束时序由时钟信号统一控制。3. 双方的时序都不是各自独立控制的。 4. 通信双方都必须严格配合时钟信号完成通信。具体通信分类STM32F103C8T6支持的通信中USART串口通信、CAN总线通信都是异步串行通信。I2C、SPI则属于同步串行通信。USB则比较复杂它不能简单归类成异步或同步这里不讨论。后续我们会学习其中最常用的三种通信方式——USART、I2C以及SPI。串行通信接口和串口要想实现串行通信除了相关协议外肯定还需要相应的硬件支持串行通信接口就是这种硬件接口。串行通信接口是指用于实现串行通信功能的硬件接口。包括物理连接引脚及其配套电路是串行通信得以实现的物理基础。串行通信接口负责在设备之间传输和接收串行数据。对于嵌入式开发而言常见的串行通信接口有 UART 接口、SPI 接口、I2C 接口、USB接口、CAN接口等。注意串口不是串行通信接口的缩写串口串口专指UART通信协议的串行通信接口也就是UART接口。所以串行通信接口有很多但串口却专指UART通信协议的串行通信接口。UART和USART上一节我们提到通常所说的“串口”专指基于 UART 通信协议的串行通信接口也就是UART接口。但在 STM32 的片内外设中我们会看到一个名为USART的外设模块那么 UART 和 USART 之间是什么关系呢首先来看一下它们的英文和中文译名UARTUniversal Asynchronous Receiver/Transmitter通用异步接收器/发送器。USARTUniversal Synchronous/Asynchronous Receiver/Transmitter通用同步/异步接收/发送器说人话就是USART 是在 UART 异步通信能力的基础上额外支持同步通信模式的一种外设/通信协议。但是在实际工程应用中同步串行通信更多会使用SPI或者I2C等USART的同步通信模式基本不会使用。在大多数嵌入式开发场景下USART 更多是以异步方式工作即作为 UART 接口使用。即大多数实际应用中USART ≈ UART。于是我们这里对相关名词的使用做一个约定如果不特别说明在后续的学习乃至于工作中串口通信 UART通信 USART通信。