串口是串行接口的简称,串行接口是采用串行通信方式的接口。串行通信是一种将需要传输的数据由低位到高位一位一位地在一条传输线上逐个传输的通信方式。
一、串行通信的数据格式
首先来了解一下串行通信的数据格式,如下图所示,串行通信的一帧数据由起始位、数据位、校验位以及停止位组成。
起始位:低电平,标志着一帧数据的开始;
数据位:数据内容,可选择为5、6、7、8位;
校验位:用于确保传输数据的正确性,提供了一种简单的错误检测机制,可分为奇校验和偶校验。
校验位的常见类型
校验位用于对数据进行简单的差错检验,常见模式有:
无校验- 不添加校验位。
奇校验- 校验位被设置为
0或1,使得数据位+校验位中1的总个数为奇数。例:数据
1011001(有4个1,偶数个),为使其为奇数,校验位应为1,最终发送1011001+1。
偶校验- 校验位被设置为
0或1,使得数据位+校验位中1的总个数为偶数。例:同上数据
1011001(4个1),已是偶数,校验位应为0。
标志位- 校验位恒为
1。空位- 校验位恒为
0。
注意:通信双方(单片机和上位机)的校验位设置必须完全一致,否则会导致帧错误,无法正常解析数据。
停止位:高电平,标志着一帧数据的结束。
二、异步串行通信的波特率
串行通信可以分为两种形式:同步串行通信和异步串行通信。
同步串行通信:通信双方在同一时钟控制下同步传输数据;
异步串行通信:通信双方使用各自的时钟控制数据传输。
对于异步串行通信来说,虽然没有同步时钟,但是通信双方必须约定并遵循同样的设置,这就需要异步串行通信中一个重要的参数来设置,该参数即波特率。
波特率即串口通信的速率,它表示每秒传输二进制数据的位数,单位是bps,即位/秒,常用的波特率有9600、19200、38400、57600和115200等。
以115200的波特率为例,即一秒传输115200个二进制数据位,那么每一位的持续时间
因此,在通信双方约定波特率为115200的情况下,只要发送方发送的每位比特位的持续时间为8.68us,那么正常情况下接收方就能准确无误地解析数据。
三、实验测试
接下来利用实验来简单验证一下上述分析:波特率为115200,一位停止位,八位数据位,无奇偶校验位,发送数据为10110101,每组发送间隔100us。
1、仿真测试
仿真测试结果如下图所示,可以看出,发送的二进制数据依次为0101011011,每个比特位持续时间为8680ns,数据发送间隔为117360-2×8680=100000ns,均符合设计要求。
2、输出波形测试
下载程序,测试对应引脚的输出波形,如下图所示,可以看出与仿真结果基本相符。
3、通信测试
通过上位机的串口调试助手接收发送的数据,通过下图所示的结果可以看出,接收到的数据为0xB5,对应的二进制数据为0b10110101,与发送端发送数据相符,通信成功。
四、数据分析
上位机正确解析出的数据是0xB5,包含的是起始位和停止位的完整串口帧数据。
以下是详细解析:
串口帧结构分析(假设8N1格式:1位起始位 + 8位数据位 + 1位停止位)
| 帧组成 | 比特序列(从左到右为发送顺序) | 说明 |
|---|---|---|
| 起始位 | 0 | 标志一帧的开始,固定为低电平。 |
| 数据位(LSB First) | 1 0 1 0 1 1 0 1 | 实际传输的数据,低位在前(Bit0 到 Bit7)。 |
| 停止位 | 1 | 标志一帧的结束,固定为高电平。 |
将数据位10101101按LSB First规则还原为正常字节:
发送顺序(LSB First): Bit0 → Bit7 =
10101101正常顺序(MSB First): Bit7 → Bit0 =
10110101转换为十六进制:
1011 0101=0xB5
0101011011是物理线缆上的完整波形。串口调试助手在接收时,会自动剥离起始位和停止位,并根据LSB First(串口标准约定)的规则,将中间8位数据10101101重组为正确的字节0xB5。
所以,上位机显示0xB5是完全正确的。我们在分析串口数据的时候要特别注意串口通信比特顺序和帧结构这两个关键点,注意:这是无奇偶校验的数据帧,如果加上校验位通常数据帧结构为11位,校验位紧接在数据位之后。
以最常见的配置为例,完整的串口数据帧传输顺序如下:
起始位- 固定1位,逻辑
0。数据位- 通常为5-9位(最常用8位),从最低位(LSB)开始发送。
校验位- 可选的1位,紧接在数据位之后。
停止位- 1位、1.5位或2位(最常用1位),逻辑1.