串口通信初识
1. 概述
在通信学科和计算机科学中,Serial communication(串行通信,NOT串口通信,应区分清楚)是一个General的概念(相对并行通信(Parallel communication)来说的),泛指所有的串行的通信协议,如 RS-232、USB、I2C、SPI、1-Wire(?)、Ethernet等。如下图(图片转自知乎):

串行通信又可分为同步和异步。
1)发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(举个栗子,在时钟信号的上升沿的时发送数据)发送数据,接收端根据发送端提供的时钟及协议内的其他内容,接收数据。这是同步串行通信(Synchronous serial communication)。I2C、SPI 等有时钟信号的协议,都属于这种通信方式;
2)发送端在数据发送之前及之后,通过特定形式的信号(例如START和STOP信号),告诉接收端,可以开始/停止接收数据了。与此同时,收发两方会约定一个数据发送的速度(即波特率,事实上波特率也带来了类似时钟的信号),发送端在发送START信号之后,就按照固定的节奏发送串行数据;同样,与此同时,接收端在收到START信号之后,也按照固定的节奏接收串行数据。这就是异步串行通信(Asynchronous serial communication)。串口通信,属于这种通信方式。
2. 几个容易混淆概念
‘串口’ ‘COM口’ ‘UART’ 等是指硬件,即某种物理接口形式;而如TTL、RS-232、RS-485是指某种通信电平标准。
【常用芯片】
PL2303、CP2102等芯片是USB转TTL串口的芯片,用USB来扩展串口(TTL电平)。
MAX232是TTL电平与RS-232电平的专用双向转换芯片。
附,TTL标准是低电平为0,高电平为1(+5V电平);RS-232 标准是正电平为 0,负电平为 1(±15V电平)。RS-485 与 RS-232 类似,但是采用差分信号负逻辑。
嵌入式里面说的串口,一般是指UART口。UART有4个 pin(VCC, GND, RX, TX), 使用 TTL 电平, 低电平为 0 (0V),高电平为 1(3.3V或以上)。
下图为USB转RS-232串口:
3. 串口通信协议(时序)
UART,一种异步串口通信协议,协议如下图:

其中每 bit 意义如下:
起始位:先发出一个逻辑“0”的信号(拉低),表示传输字符开始。
数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以次来校验数据传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也就越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有数据传输。
UART工作原理
发送数据过程:空闲状态,线路处于高电平;当收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。
数据接收过程:空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲。
由于UART是异步传输,没有传输同步时钟,为了保证数据的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误吗。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。
UART的接收数据时序为:
当检测到数据的下降沿时,表明线路上有数据进行传输,这时计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;
当计数器的值为40时,采样的值为第一位数据,依次类推,进行后面6个数据的采样。
如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,数据接收完成。
一个标准的10位异步串行通信协议(1个起始位、1个停止位和8个数据位)收发时序,如下图所示:

浙公网安备 33010602011771号