微控制器与电脑之间的数据传输,通常采用串行通讯方式。

这种通讯方式的硬件连接非常简单,仅需三根线:
- TX(发送): 微控制器的发送端,连接电脑的接收端。
- RX(接收): 电脑的发送端,连接微控制器的接收端。
- GND(地线): 提供公共的参考电平。
当我们通过微控制器向电脑发送数据时,数据经由TX线传输。例如,发送大写字母“A”,那么在TX线上实际传输的是什么呢?
通过示波器捕获的波形如下:

上图展示了一帧完整的串行数据,共10位,从左至右依次发送:
- 第1位(起始位): 恒为低电平(逻辑0),标志着数据帧的开始。
- 第2-9位(数据位): 8位二进制数据,代表要传输的实际信息。
- 第10位(停止位): 恒为高电平(逻辑1),标志着数据帧的结束。
在二进制中,数据位的权重从低位到高位依次是1、2、4、8……128。根据捕获的“A”的波形,将有效数据位的值相加:1+0+0+0+0+0+0+64 = 65。
数字65与字母“A”有何关联?这需要查询ASCII码表。在标准ASCII码表中,十进制值65对应大写字母“A”。
同理,若要发送字母“B”,微控制器则需要发送数值66。因此,我们只需根据ASCII码表将要发送的字符转换为对应数值,再由微控制器转换为特定的高低电平序列即可。
然而,发送这些电平并非任意速率进行,必须遵循严格的时间间隔。这个时间间隔由 波特率(Baud Rate) 决定。常见的波特率是9600,意指每秒传输9600个二进制位(比特)。由此可计算出每比特的持续时间:
- 1 bit时间 = 1 / 9600 秒 ≈ 104.1667 微秒 ≈ 0.1毫秒。
通信双方(发送端与接收端)必须设定相同的波特率,接收方才能以正确的时序解析数据,这是所有底层通信协议协同工作的基础。若波特率不匹配,将导致数据解析错乱。

因此,若以9600波特率发送数据“66”(B),就必须每隔约104微秒改变一次TX线的电平状态。如需提高传输速度,可选用更高的波特率,如115200。此时,每比特时间缩短至约8.68微秒,速度提升十多倍。
串口通讯的数据帧结构详解
一帧标准的数据通常包含以下部分(以最常见的8N1格式为例):
- 起始位(Start Bit): 1位逻辑0。用于同步接收时钟,标志字符传输开始。
- 数据位(Data Bits): 紧接起始位之后,是通讯的有效信息主体,通常为5-9位(常用8位)。传输顺序为先低位(LSB),后高位(MSB)。
- 奇偶校验位(Parity Bit): 可选位,占1位。用于简单的错误检测(奇校验或偶校验)。
- 停止位(Stop Bit(s)): 1位、1.5位或2位的逻辑1。标志一个字符传输的结束。
- 空闲位(Idle): 在停止位之后,下一个起始位之前,线路保持逻辑1高电平,表示空闲状态。
在实际开发中,我们无需手动计算时间间隔和电平序列。以常见开发板为例,发送大写字母“C”的程序极其简单:在初始化阶段设置好波特率,然后直接调用send(‘C’)之类的函数即可。

库函数封装了所有底层细节:它根据ASCII码将‘C’转换为数值67,再按照设定的波特率,自动生成包含起始位、数据位、停止位的完整电平序列,并严格按时序通过TX线发送出去。这就是串口通讯的本质——无论上层API如何简化,最终在物理线缆上传输的,永远是严格按照时序和帧结构组织的高低电平脉冲。
|