要理解串口,首先要明白“串行通信”和“并行通信”的区别。
* **并行通信**:好比一条8车道的高速公路,一次可以同时发送8位数据(比如一个字节)。速度快,但需要大量电线(每条数据位一根线),抗干扰差,距离短。早期的打印机接口(LPT)就是典型的并行通信。
* **串行通信**:好比一条单车道公路,数据位像车队一样,一个接一个地按顺序通过。速度相对慢,但只需要很少的线(甚至两根),成本低,抗干扰能力强,适合长距离通信。
**串口(Serial Port)** 就是一种实现串行通信的硬件接口和协议。*常见的标准是 **RS-232**。
---
### 详细原理分解
我们可以从**硬件连接**、**数据帧格式**、**通信过程**和**关键参数**四个方面来深入理解。
#### 1. 硬件连接与信号线
传统的RS-232串口使用DB9或DB25连接器,但**信号线只需要3根:
* **TXD (Transmit Data)**:数据发送线。A设备的TXD连接B设备的RXD。
* **RXD (Receive Data)**:数据接收线。A设备的RXD连接B设备的TXD。
* **GND (Ground)**:公共地线。为所有信号提供统一的电压参考点,至关重要。
这种**交叉互连**的方式称为“零调制解调器”连接。除了这三根线,还有DSR/DTR、RTS/CTS等用于硬件流控制的信号线,在现代简单应用中较少使用。
#### 2. 数据帧格式 - “如何打包一个字节”
串口不是简单地发送0/1数字信号,而是将每个字节(8位)的数据“打包”成一个标准的“帧”来发送。一帧数据包含以下部分:
```
[ 空闲状态 ] [ 起始位 ] [ 数据位 (5-8位) ] [ 校验位 (可选) ] [ 停止位 (1, 1.5, 2位) ] [ 空闲状态 ]
高电平 0 LSB ... MSB 0/1/无 高电平 高电平
```
* **空闲状态**:线路保持在高电平(逻辑1)。
* **起始位**:一个始终为低电平(逻辑0)的位。它的作用是**同步时钟**,告诉接收方:“注意!一帧数据马上开始!” 这是异步通信的关键。
* **数据位**:紧接着起始位之后,是要传输的实际数据,通常是8位(一个字节)。从****有效位(LSB)** 开始发送。
* **校验位**:用于简单的错误检测。
* **偶校验**:保证数据位+校验位中“1”的个数为偶数。
* **奇校验**:保证“1”的个数为奇数。
* **无校验**:不添加此位。
* **停止位**:固定为高电平(逻辑1),标志一帧数据的结束。可以是1位、1.5位或2位的时间长度。它确保在下一帧起始位(低电平)到来之前,有一个明确的“恢复”到高电平的间隙。
* **下一帧**:停止位之后,线路恢复空闲高电平,等待下一个起始位。
**关键点**:串口通信是**异步**的,这意味着发送和接收双方**没有共享的时钟信号**来同步每一位。它们依靠预先约定好的**波特率**和**起始位/停止位的硬性规定**来实现自同步。
#### 3. 通信过程 - “发送与接收如何协同工作”
假设A设备向B设备发送字符‘A’(ASCII码为65,二进制01000001)。双方约定:波特率9600,8位数据,无校验,1位停止位。
**在A设备(发送端):**
1. 检测到线路空闲(高电平)。
2. 拉低线路电平**1个比特的时间**,发送**起始位**。
3. 从**位开始,依次将01000001的每一位,每一位持续1/9600秒,放到TXD线上。
4. 发送**停止位**(拉高电平,持续1个比特的时间)。
5. 完成一帧发送,线路保持高电平(空闲)。
**在B设备(接收端):**
1. 持续监测RXD线,等待从高电平到低电平的**下降沿**(起始位开始的标志)。
2. 一旦检测到下降沿,启动内部定时器,等待**1.5个比特时间**(目的是采样到数据位的中间点,避开边沿不稳定区域)。
3. 在1.5、2.5、3.5...个比特时间点上,对线路电平进行采样,依次读取8个数据位。
4. 采样停止位(应为高电平),如果为低,则可能发生“帧错误”。
5. 将采样到的8位数据组合成一个字节,存入接收缓冲区。
6. 线路恢复空闲,继续等待下一个起始位。
#### 4. 关键参数 - “双方对话的约定”
要使通信成功,收发双方必须**严格约定**以下参数:
* **波特率**:每秒传输的**符号(比特)个数**。常见的有9600, 115200等。波特率决定了每个比特的持续时间 `T = 1 / 波特率`。**双方波特率必须一致**,误差一般不能超过5%,否则会导致采样错位,数据全部错误。
* **数据位**:每帧中实际数据位的长度,通常为8位。
* **校验位**:奇校验、偶校验或无校验。双方必须一致。
* **停止位**:1、1.5或2位。双方必须一致。
* **流控制**(可选):
* **硬件流控(RTS/CTS)**:通过额外的信号线告知对方“我是否可以接收数据”,用于防止接收缓冲区溢出。
* **软件流控(XON/XOFF)**:通过发送特殊字符(XON=0x11, XOFF=0x13)来控制数据流。
---
### **特点总结
* **异步通信**:无需时钟线,依靠起始位同步。
* **全双工**:可以同时进行发送和接收(因为TXD和RXD**)。
* **点对点**:通常用于两个设备之间的直接通信。
* **长距离与抗干扰**:RS-232标准理论上可达15米,通过转换器(如RS-485)可达千米。差分信号(如RS-485)抗共模干扰能力强。
* **简单通用**:协议简单,几乎所有微控制器都内置硬件UART,软件编程容易。
### 现代应用与演变
* **物理形态演变**:经典的DB9接口在PC上已基本被USB取代。现在更多以“TTL串口”(3.3V或5V电平)的形式存在于**单片机、嵌入式设备、开发板(如Arduino)、路由器、工业控制器**内部。
* **USB转串口**:为了兼容传统串口设备,大量使用 **“USB转TTL串口”芯片**(如CH340、CP2102、FT232)。在PC上,它会虚拟出一个COM端口。
* **逻辑**不变**:无论物理接口如何变化,其**异步串行通信的UART**协议**(数据帧格式、起始位、停止位、波特率)保持不变,是工程师调试设备、进行底层数据交换的“****”。
### 一个生动的比喻
把串口通信想象成两个人用**摩尔斯电码**在发电报:
* **波特率** = 双方约定好的发报速度(每个“点/划”的时长)。
* **起始位** = 每次发一个字符前,先说“喂,注意!”(一个固定的短脉冲)。
* **数据位** = 字符本身的点划组合(8位二进制)。
* **停止位** = 发完一个字符后,一个明显的停顿(表示这个字符结束了)。
* **校验位** = 发完后问一句“我发的对吗?”(简单的确认)。
* **交叉线** = 你的发报机连着我的收报机,我的发报机连着你的收报机。
正是这些简单而严谨的约定,使得串口技术历经数十年,仍然是电子设备间*基础、*可靠的通信方式之一。