找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

279

积分

0

好友

27

主题
发表于 前天 23:47 | 查看: 4| 回复: 0

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

图片

这种通讯方式的硬件连接非常简单,仅需三根线:

  • 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”。

6403.jpeg

同理,若要发送字母“B”,微控制器则需要发送数值66。因此,我们只需根据ASCII码表将要发送的字符转换为对应数值,再由微控制器转换为特定的高低电平序列即可。

然而,发送这些电平并非任意速率进行,必须遵循严格的时间间隔。这个时间间隔由 波特率(Baud Rate) 决定。常见的波特率是9600,意指每秒传输9600个二进制位(比特)。由此可计算出每比特的持续时间:

  • 1 bit时间 = 1 / 9600 秒 ≈ 104.1667 微秒 ≈ 0.1毫秒。

通信双方(发送端与接收端)必须设定相同的波特率,接收方才能以正确的时序解析数据,这是所有底层通信协议协同工作的基础。若波特率不匹配,将导致数据解析错乱。

图片

因此,若以9600波特率发送数据“66”(B),就必须每隔约104微秒改变一次TX线的电平状态。如需提高传输速度,可选用更高的波特率,如115200。此时,每比特时间缩短至约8.68微秒,速度提升十多倍。

串口通讯的数据帧结构详解

一帧标准的数据通常包含以下部分(以最常见的8N1格式为例):

  1. 起始位(Start Bit): 1位逻辑0。用于同步接收时钟,标志字符传输开始。
  2. 数据位(Data Bits): 紧接起始位之后,是通讯的有效信息主体,通常为5-9位(常用8位)。传输顺序为先低位(LSB),后高位(MSB)。
  3. 奇偶校验位(Parity Bit): 可选位,占1位。用于简单的错误检测(奇校验或偶校验)。
  4. 停止位(Stop Bit(s)): 1位、1.5位或2位的逻辑1。标志一个字符传输的结束。
  5. 空闲位(Idle): 在停止位之后,下一个起始位之前,线路保持逻辑1高电平,表示空闲状态。

在实际开发中,我们无需手动计算时间间隔和电平序列。以常见开发板为例,发送大写字母“C”的程序极其简单:在初始化阶段设置好波特率,然后直接调用send(‘C’)之类的函数即可。

图片

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




上一篇:Java实现Excel水印替换实战:先清除旧水印再添加新水印
下一篇:MCP 代码执行实践指南:降低AI智能体成本并提升交互效率
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-8 07:52 , Processed in 0.079311 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表