|
|
@ -0,0 +1,189 @@
|
|
|
|
|
|
|
|
[TOC]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 1. 串口通信概述
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 1.1. 计算机通信
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
问题:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 我们知道的通信方式有哪些?
|
|
|
|
|
|
|
|
2. 理解通信技术的发展。
|
|
|
|
|
|
|
|
3. 通信的要素:以烽火为例子。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
通信要素:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 硬件:通信介质
|
|
|
|
|
|
|
|
2. 软件:
|
|
|
|
|
|
|
|
1. 语法:格式
|
|
|
|
|
|
|
|
2. 语义:格式中信息的具体含义
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 1.1.1. 并行通信
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
优势:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 一次传输1个字节;
|
|
|
|
|
|
|
|
2. 速度快;
|
|
|
|
|
|
|
|
3. 信息表达相对简单;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
劣势:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 只适合短距离传输;
|
|
|
|
|
|
|
|
2. 成本高。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
问题:那些地方采用并行通信?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 1.1.2. 串行通信
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
优势:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 适合长距离传输;
|
|
|
|
|
|
|
|
2. 成本低;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
劣势:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 速度相对较慢;
|
|
|
|
|
|
|
|
2. 信息表达(通信控制)相对复杂;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
问题:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 那些设备是串行通信?
|
|
|
|
|
|
|
|
2. 是否可以结合串行和并行的优势?如何结合?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 1.2. 串行通信的基本概念
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 1.2.1. 同步和异步
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 通信双方需要专门又时钟线来同步双方的时钟,并保持严格一致;
|
|
|
|
|
|
|
|
2. 通信速度相对较高;
|
|
|
|
|
|
|
|
3. 如 SPI、I2C通信;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 不需要时钟同步;
|
|
|
|
|
|
|
|
2. 通信双方对时间的理解差异可以有少量的偏差;
|
|
|
|
|
|
|
|
3. 每通信一帧(固定数量的bit位),会进行一次同步(如上图的START和STOP电平);
|
|
|
|
|
|
|
|
4. 例如USB、UART(串口);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 1.2.2. 异步串行通信的特点
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 以固定的长度(位)传输一组数据(帧);对于串口来说,一帧一般是一个字符(注意不是字节,以前一个字符是7个位;现在几乎都是8个位,和字节是对应的);
|
|
|
|
|
|
|
|
2. 通过帧之间的间隔来进行时间的同步;
|
|
|
|
|
|
|
|
3. 如果通信双方对时间的理解差异较小,那就可以在一帧的时间片内检查到有效数量的0和1的序列(帧),这样不需要通信双方对时间的理解完全一致,因为在一帧内的时间差异几乎可以忽略。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**字符格式:**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
一般由起始位、数据位、校验位、停止位组成。对于连续的通信来说,停止也就是起始,因此往往设置停止就可以了。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 空闲情况下,通信线路的电平为高;
|
|
|
|
|
|
|
|
2. 当需要传输数据的时候,发送方把电位拉低,持续一段时间(开始位);
|
|
|
|
|
|
|
|
3. 然后连续发送一个字符和校验位;
|
|
|
|
|
|
|
|
4. 最后拉高电平至少持续一段时间(停止位),表示该帧数据发送完成;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
从上述的通信过程得知,空闲(不传输数据)为高电平;一旦低电平后,表示通信开始;字符传输完成后,拉高电平;因此起始其实是可以不要的。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
奇偶校验:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
奇校验:如果数据中1的个数为奇数,则奇校验位0,否则为1。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
偶校验:如果数据中1的个数为偶数,则偶校验位0,否则为1。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**波特率:**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
波特率是每秒传输位的单位(bps),波特率越高,表示通信速率越快。注意,在任何通信场景中,通信速率的都应该用bps表示;例如100M的以太网,表示 100Mbps,也就是每秒大约传输10M字节(本来应该是100M/8,但是可能有停止位和校验,因此大约估算是100M/10)。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 1.2.3. 异步串口通信的数据接收过程
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我们假设采样时钟是波特率的16倍,具体的数据接收过程如下:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 接收过程由起始位的下降沿启动。
|
|
|
|
|
|
|
|
2. 接收端等待8个时钟周期,以便建立一个接近起始位周期中点的采样点。
|
|
|
|
|
|
|
|
3. 接收端再次等待 16个时钟周期,使其进入第一个数据位周期的中点。
|
|
|
|
|
|
|
|
4. 第一个数据位被采样并存储在接收寄存器中。
|
|
|
|
|
|
|
|
5. 串口模块在采样第二个数据位之前,等待另外16个时钟周期。
|
|
|
|
|
|
|
|
6. 重复此过程,直到所有的数据位都被采样和存储。
|
|
|
|
|
|
|
|
7. 由停止位的上升沿使数据线返回到空闲状态。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 1.2.4. 串行通信的传输方向
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 1.3. STM32串口通信
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**数据寄存器:**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. TDR 发送寄存器,结合发送位移寄存器,把数据以电平的方式用时间进行排序发送到TX引脚;
|
|
|
|
|
|
|
|
2. RDR 接收寄存器,通过接收位移寄存器组成的一个字符装载到RDR;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**通信状态标志位:**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
轮询方式可以通过读取上述的状态来进行控制:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. RXNE表示有新的数据(字符);
|
|
|
|
|
|
|
|
2. TXE:表示可以向TDR写入新的数据;
|
|
|
|
|
|
|
|
3. TC:发送完成;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
中断方式也会有对应的三种方式。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 1.4. 硬件结构
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
串口通信的示意图是这样的:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
但是目前的很多计算机没有串口,因此在开发板上有一个USB转串口的芯片:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
因此实际的情况是这样:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这个芯片在开发板的位置是:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 2. HAL库外设初始化过程
|