UART 是一种用于串行通信的协议,它允许数据通过一条线路(或两条线路:一条用于发送,另一条用于接收)在计算机或其他设备之间传输。它广泛应用于设备之间的通信,如嵌入式系统、传感器、计算机串口、调试端口等。
在 UART 协议中,数据是 串行 传输的,意味着数据不是同时传输的,而是一个比特一个比特地传输。我们通常会设置每个数据帧的格式来确保正确的传输和接收,这就涉及到 开始位、数据位、校验位和结束位。
UART 数据帧结构
一个典型的 UART 数据帧的组成如下:
| 开始位 | 数据位 | 校验位 | 结束位 |
1. 开始位(Start Bit)
-
功能:开始位用来通知接收设备,数据帧即将开始传输。
-
原理:在串行通信中,数据传输是按比特(bit)顺序发送的。为了确保接收设备知道数据从哪里开始,发送方会在数据帧的最前面发送一个特殊的信号,称为 开始位。
-
特点:
-
开始位通常为 低电平(0),表示数据传输的开始。
-
数据帧的开始位的作用就是从 高电平(无数据)切换到 低电平,表示数据传输的开始。
-
由于 UART 是 异步通信,开始位帮助接收方对齐数据帧。
-
2. 数据位(Data Bits)
-
功能:数据位是传输的实际数据。它包含了我们想要传送的信息。
-
原理:数据位是传输的核心内容,每个数据位表示一个二进制数字(0 或 1)。通常,数据位的长度为 5 位、6 位、7 位或 8 位(8 位是最常见的)。
-
特点:
-
数据位的数量由通信协议或设置决定,常见的是 8 位数据位(即一个字节)。
-
每个数据位在传输时会按照顺序一个一个地传送给接收方。发送方会逐个发送数据位,从低位到高位。
例如:假设你要发送的数据是 字母 "A"(ASCII值为 65),它的二进制表示为 01000001。如果使用 8 位数据位来传输,它就分成 8 个数据位来发送。
-
3. 校验位(Parity Bit)
-
功能:校验位是为了保证数据在传输过程中的 完整性。它的作用是检测传输中是否发生了错误。
-
原理:
-
校验位的设置有几种不同的模式,通常是 偶校验、奇校验或 无校验。
-
校验位是通过对数据位的“奇偶性”进行设置来完成的。它帮助接收方检查是否有位被错误地传输。
几种常见的校验位设置:
-
无校验(None):不使用校验位,纯粹传输数据。
-
偶校验(Even Parity):使数据中 1 的数量变为 偶数,如果原数据中 1 的数量是奇数,就设置校验位为 1;如果是偶数,则校验位为 0。
-
奇校验(Odd Parity):使数据中 1 的数量变为 奇数,如果原数据中 1 的数量是偶数,就设置校验位为 1;如果是奇数,则校验位为 0。
例如:如果发送的数据是 01010100,在偶校验模式下,校验位会检查该数据中 1 的数量(4个),是偶数,因此校验位为 0。如果 1 的数量是奇数,校验位会设为 1。
-
4. 结束位(Stop Bit)
-
功能:结束位用来标识数据传输的结束,告知接收设备数据帧已经完成,可以开始处理数据。
-
原理:结束位帮助接收方识别每一帧数据的结束,并准备接收下一帧数据。它通常是一个 高电平(1) 信号,表示传输完成。
-
特点:
-
结束位的数量可以是 1 位、1.5 位 或 2 位,其中 1 位结束位 是最常见的。
-
结束位通常设为 高电平(1),如果在数据传输后没有正确的结束位,接收方可能会误认为数据还在传输中。
-
总结:UART 数据帧组成
一个完整的 UART 数据帧通常是这样的:
| Start Bit | Data Bits | Parity Bit (optional) | Stop Bit(s) |
-
开始位:标志着数据的开始,通常为 0(低电平)。
-
数据位:实际的数据内容,通常为 8 位(即 1 字节)。
-
校验位:用于检测数据传输是否发生错误,可以选择有或没有。
-
结束位:标志着数据的结束,通常为 1(高电平)。
波特率
计算步骤
-
确定每个数据包的位数(Bit per Character):
-
开始位:1 位
-
数据位:通常是 8 位
-
停止位:通常是 1 位
-
校验位:如果使用校验位,通常是 1 位(如果没有校验位,则为 0 位)
因此,每个数据包(字符)所需的总位数可以用以下公式表示:
每字符位数=开始位+数据位+停止位+校验位\text{每字符位数} = \text{开始位} + \text{数据位} + \text{停止位} + \text{校验位}每字符位数=开始位+数据位+停止位+校验位 -
-
计算每秒钟能传输的字节数:
每秒字节数=波特率每字符位数\text{每秒字节数} = \frac{\text{波特率}}{\text{每字符位数}}每秒字节数=每字符位数波特率其中,波特率是每秒钟传输的比特数(bps),每字符位数是每个字符所需要的总位数。
举个例子
假设你使用 115200 波特率 和 8N1 配置(8 数据位,1 开始位,1 停止位,无校验位):
-
每字符位数:
-
开始位:1 位
-
数据位:8 位
-
停止位:1 位
-
校验位:0 位(无校验位)
每字符位数 = 1 + 8 + 1 + 0 = 10 位
-
-
每秒钟传输的字节数:
每秒字节数=11520010=11520 字节/秒\text{每秒字节数} = \frac{115200}{10} = 11520 \, \text{字节/秒}每秒字节数=10115200=11520字节/秒
所以,在 115200 波特率 的情况下,每秒钟能够传输 11520 字节。