当前位置: 首页 > news >正文

【驱动设计的硬件基础】串口

目录

一、串口:电子世界的 "老式电话"

1.1 它藏在你身边的每个角落

1.2 为什么不是并口?单车道反而更能跑

1.3 异步通信:没有 "同步器" 的默契对话

二、串口家族大阅兵:各有各的 "绝活"

2.1 嵌入式工程师的 "初恋":UART

2.2 计算机的 "老伙计":RS-232

2.3 工业现场的 "抗干扰王者":RS-485

2.4 USB 时代的 "转译者":USB 转串口

三、串口硬件大拆解:麻雀虽小五脏全

3.1 核心大脑:UART 控制器

3.2 电平转换:MAX232 的 "变压魔法"

3.3 节奏大师:晶振的 "定海神针"

3.4 物理接口:从排针到 DB9

四、数据是怎么 "打包" 的?串口协议全解析

4.1 数据帧结构:像套娃一样层层包裹

4.2 波特率:决定 "说话速度" 的关键

4.3 校验位:数据纠错的 "小保镖"

4.4 串口的 "实战场景":从开发板到工厂

六、总结


最近帮朋友调试单片机的时候,又和串口打了一整天交道。看着电脑串口调试助手跳动的字符,突然觉得这个 "古老" 的通信接口,就像电子世界里的老邮差,默默传递着数据却鲜少被关注。今天聊聊这个驱动设计中最基础却又无比重要的硬件模块 —— 串口。​

一、串口:电子世界的 "老式电话"

1.1 它藏在你身边的每个角落

你可能没注意过,但串口真的无处不在:

  • 家里的老式路由器,后面那个标着 "Console" 的小孔是串口;
  • 工厂里的 PLC(可编程逻辑控制器),和传感器通信靠的是串口;
  • 你给开发板下载程序用的 USB 转串口线,本质是把 USB 信号转成了串口信号。

它就像电子设备间的 "老式电话",虽然没有 5G 的速度,却胜在简单可靠 —— 只需要两根线(发送 TX 和接收 RX),就能让两个设备 "说上话"。

1.2 为什么不是并口?单车道反而更能跑

早期电脑还有一种叫 "并口" 的接口(比如打印机的 LPT 口),一次能传 8 位数据,像八车道高速公路。但它有个大问题:线多容易打架,传输距离超不过 2 米,还特别挑环境 —— 稍微有点电磁干扰,数据就乱成一锅粥。

串口就聪明多了:一次只传 1 位数据,像单车道公路。虽然慢(常见波特率 9600bps,每秒传 9600 位),但线少(最少 3 根:TX、RX、GND)、抗干扰强、能传 1200 米(RS-485 标准)。这种 "小而精" 的设计,让它在工业控制、嵌入式开发里混得风生水起。

1.3 异步通信:没有 "同步器" 的默契对话

和 SPI、I2C 这些需要时钟线的 "同步通信" 不同,串口玩的是 "异步通信"。简单说就是:发送方和接收方提前约好 "说话速度"(波特率),然后各说各的

举个栗子:你和朋友打电话,提前约好每分钟说 100 个字。你说 "吃饭了吗",他按这个速度听,就能正确接收;要是你突然改成每分钟 200 字,他就会听成 "吃了吗饭"—— 这就是串口调试时最常见的 "乱码",十有八九是波特率没设对。

二、串口家族大阅兵:各有各的 "绝活"

串口不是一个单一标准,而是根据不同场景进化出的 "家族"。咱们挑几个最常用的成员认识下:

2.1 嵌入式工程师的 "初恋":UART

UART(通用异步收发器)是嵌入式开发的 "入门级选手"。几乎所有单片机(比如 STM32、ESP32)都自带 UART 模块,就像手机自带通话功能一样。

它的特点

  • 电平是 TTL(3.3V 或 5V),只能和同电平的设备直接连(比如两个单片机);
  • 数据格式能自定义:波特率(9600/115200 等)、数据位(5-8 位)、停止位(1/2 位)、校验位(奇 / 偶 / 无);
  • 硬件简单:只需要 TX(发)、RX(收)、GND(地)三根线。

常见场景:单片机调试时用printf打印日志,蓝牙模块(如 HC-05)和单片机通信,都是 UART 的典型应用。

2.2 计算机的 "老伙计":RS-232

还记得台式机后面那个 9 针的 DB9 接口吗?这就是 RS-232 的 "身份证"。早期计算机用它连 Modem(猫)、打印机,现在新电脑虽不集成,但通过 USB 转 RS-232 线还能接着用。

它的 "特殊脾气"

  • 电平是负逻辑:-3V~-15V 表示 1,+3V~+15V 表示 0(和单片机的 TTL 电平完全相反);
  • 需要电平转换芯片(如 MAX232):把单片机的 3.3V 转成 RS-232 的 ±10V,否则 "鸡同鸭讲";
  • 传输距离短(最多 15 米),但支持全双工(能同时收发)。

冷知识:DB9 接口的 2 脚是 RX(接收),3 脚是 TX(发送),所以接线时要 "TX 接 RX,RX 接 TX",否则收不到数据!

2.3 工业现场的 "抗干扰王者":RS-485

工厂里的电机、变频器会产生很强的电磁干扰,普通串口扛不住。这时候 RS-485 就派上用场了 —— 它是工业控制的 "抗干扰专家"。

它的 "硬核技能"

  • 差分传输:用两根线(A 和 B)传相反的信号,接收端通过 A-B 的电压差判断数据(>200mV 是 1,<-200mV 是 0)。干扰对两根线的影响一样,一减就抵消了;
  • 长距离传输:最远 1200 米,还能挂 32 个设备(总线型连接);
  • 半双工通信:同一时间只能发或收,需要用 DE/RE 引脚切换状态。

应用场景:工厂里的 PLC 连传感器、变频器连触摸屏,几乎都是 RS-485 的天下。

2.4 USB 时代的 "转译者":USB 转串口

现在电脑基本没串口了,但工程师们发明了 "USB 转串口芯片"(如 CH340、CP2102),让老设备也能连电脑。

它的 "神操作"

  • 电脑端:装驱动后显示为虚拟串口(如 COM3),用串口调试助手就能通信;
  • 设备端:输出 TTL 电平的 TX/RX,直接连单片机;
  • 体积小:现在的开发板(比如 Arduino)都集成了这个模块,插 USB 就能调试。

串口家族关系图:

三、串口硬件大拆解:麻雀虽小五脏全

别看串口线就几根,背后的硬件设计可讲究了。咱们以最常见的 "单片机 + USB 转串口模块" 为例,拆开看看里面有啥宝贝。

3.1 核心大脑:UART 控制器

单片机里的 UART 控制器,就像 "翻译官"—— 把 CPU 的并行数据(8 位一起传)转成串行位流(一位一位传),或者反过来。

工作流程

  • 发送时:CPU 给一个字节(比如 0x41,对应 'A'),控制器在前面加 1 位起始位(0),后面加 1 位停止位(1),可能再加校验位,组成数据帧,然后按波特率从 TX 引脚输出;
  • 接收时:RX 引脚检测到起始位(高变低),开始按波特率采样数据位,去掉起始 / 停止 / 校验位,把有效数据存到缓冲区,通知 CPU 来取。

3.2 电平转换:MAX232 的 "变压魔法"

如果要连电脑的 RS-232 接口,单片机的 TTL 电平(3.3V)得转成 RS-232 的 ±10V。这时候 MAX232 芯片就登场了 —— 它像个 "小变压器"。

工作原理

  • 内部有电荷泵,能把 3.3V 电源转成 ±10V;
  • 发送方向(TX):单片机的 3.3V 高电平→MAX232→输出 - 10V(RS-232 的 1);
  • 接收方向(RX):电脑的 + 10V(RS-232 的 0)→MAX232→输出 3.3V(单片机的 0)。

3.3 节奏大师:晶振的 "定海神针"

串口通信的波特率准不准,全靠晶振。比如常用的 11.0592MHz 晶振,是专门为串口设计的 —— 它分频后能得到精确的波特率(比如 115200bps 误差为 0)。

小知识:如果晶振不准,波特率就会飘,接收方采样时间不对,数据就会乱码。所以调试时如果波特率总设不对,不妨检查下晶振是否正常。

3.4 物理接口:从排针到 DB9

不同串口标准,接口长得不一样:

  • UART:一般是排针(TX/RX/GND),方便插杜邦线;
  • RS-232:9 针 DB9 接口(公头 / 母头),常用 2(RX)、3(TX)、5(GND)脚;
  • RS-485:端子排(A/B/GND),有些设备用 RJ45 接口(和网线接口一样)。

四、数据是怎么 "打包" 的?串口协议全解析

串口传数据不是 "裸奔",而是按约定的格式 "打包"。咱们以最常用的 "8 数据位、1 停止位、无校验" 格式为例,看看数据帧长啥样。

4.1 数据帧结构:像套娃一样层层包裹

一个完整的数据帧包括:

起始位(1位,0)→ 数据位(5-8位,低位先传)→ 校验位(可选)→ 停止位(1/1.5/2位,1)

举个栗子:发送字符 'H'(ASCII 码 0x48,二进制 01001000),数据位是 8 位,低位先传,所以实际传的顺序是00010010(低位在前)。加上起始位(0)和停止位(1),整个位流就是:

0(起始)→0→0→0→1→0→0→1→0(数据位)→1(停止)

4.2 波特率:决定 "说话速度" 的关键

波特率是每秒传的二进制位数,常见的有 9600、19200、115200 等。比如 9600 波特率,每位持续时间是 1/9600≈104 微秒。

划重点:发送方和接收方的波特率必须一摸一样!不然接收方采样时间错了,数据就成乱码。

4.3 校验位:数据纠错的 "小保镖"

为了防止数据传错,串口可以加校验位:

  • 无校验:最简单,不检查,适合对错误不敏感的场景(比如调试日志);
  • 奇校验:数据位 + 校验位的 1 的个数是奇数。比如数据位有 3 个 1,校验位就设 0(3+0=3,奇数);
  • 偶校验:数据位 + 校验位的 1 的个数是偶数。比如数据位有 3 个 1,校验位就设 1(3+1=4,偶数)。

校验位只能查错,不能纠错。如果需要更可靠的通信,还得在软件里加 CRC 校验。

4.4 串口的 "实战场景":从开发板到工厂

说了这么多理论,咱们来看看串口在实际中的应用,保证你看完就能上手。

①嵌入式调试:用串口打印 "debug 日志"

学单片机的第一步,肯定是用串口打印 "Hello World"。比如在 STM32 里,重定向printf到串口,就能把变量值、运行状态输出到电脑的串口调试助手。

举个栗子

// STM32串口初始化代码(伪代码)
void uart_init() {RCC->APB2ENR |= 1<<14; // 使能USART1时钟GPIOA->CRH = 0x4B00; // PA9(TX)推挽输出,PA10(RX)浮空输入USART1->BRR = 0x0450; // 115200波特率(16MHz时钟)USART1->CR1 |= 1<<13; // 使能USART1
}// 重定向printf到串口
int fputc(int ch, FILE *f) {USART1->DR = (uint8_t)ch;while(!(USART1->SR & 1<<7)); // 等待发送完成return ch;
}// 主函数
int main() {uart_init();while(1) {printf("当前温度:%d℃\r\n", temp); // 打印温度delay(1000);}
}

②工业控制:PLC 和传感器的 "对话"

工厂里的 PLC(比如西门子 S7-200),要连各种传感器(温湿度、压力),这时候 RS-485 就派上用场了。PLC 作为主设备,轮询每个传感器的地址,读取数据。

接线注意

  • 总线两端要接 120Ω 终端电阻,防止信号反射;
  • 所有设备的 A 线连一起,B 线连一起,GND 共地;
  • 传感器地址要唯一(1-32),避免通信冲突。

③物联网:串口连 WiFi / 蓝牙模块

现在很多物联网设备(比如智能插座、温湿度监测器),用单片机 + WiFi 模块(如 ESP8266)或蓝牙模块(如 HC-05)就能连网。模块和单片机之间,就是通过串口通信的。

操作流程

  1. 单片机通过串口给模块发 AT 指令(比如AT+CWJAP="SSID","password"),配置 WiFi 参数;
  2. 模块连网后,接收云端数据,通过串口传给单片机;
  3. 单片机处理数据,控制外设(比如开 / 关继电器)。

④常见问题排查:串口调试的 "坑"

调试串口时,可能遇到这些问题,试试这些解决办法:

问题现象可能原因解决方法
接收乱码波特率不匹配 / 晶振不准检查双方波特率,换晶振
收不到数据接线错误(TX-RX 没交叉)TX 接对方 RX,RX 接对方 TX
数据丢失接收缓冲区溢出增大缓冲区,用 DMA 传输
电平异常电平不匹配(TTL 转 RS-232)加 MAX232 芯片,检查电源

六、总结

从最早的计算机外设到现在的物联网设备,串口已经 "服役" 了半个多世纪。它可能不是最快的,但一定是最可靠、最通用的通信接口。对于驱动开发者来说,搞懂串口的硬件基础和协议规则,就像学盖楼先打地基 —— 只有地基稳了,才能盖更高的楼。

如果这篇博客帮你理清了串口的思路,或者你在实践中遇到了新问题,欢迎在评论区留言!


相关文章:

  • aflplusplus:开源的模糊测试工具!全参数详细教程!Kali Linux教程!(三)
  • C++开源协程库async_simple有栈协程源码分析
  • Python 函数
  • linux驱动开发(9)- 信号量
  • 了解Redis的使用
  • 如何给Hexo-butterfly主题博客在复制时添加版权声明
  • Hive SQL:一小时快速入门指南
  • 读取配置文件到Settings对象的完整实现
  • 【AS32系列MCU调试教程】驱动开发:AS32驱动库的集成与应用实例
  • 拓展:###单向循环链表###
  • comfyui插件和comfyui mac安装
  • 设备被看门狗重置问题
  • RHCE 练习四:编写脚本实现以下功能
  • web方向第一次考核内容
  • Linux免驱使用slcan,使用方法以Ubuntu为例
  • g++ a.cpp -o a ‘pkg-config --cflags --libs opencv4‘/usr/bin/ld: 找不到 没有那个文件或目录
  • [特殊字符] Next.js Turbo 模式不支持 @svgr/webpack 的原因与解决方案
  • Redis的list的底层原理
  • 后端通过nignx代理转发,提供接口供前端在防火墙外访问
  • Arduino入门教程​​​​​​​:4、打印字符到电脑
  • 涿鹿镇做网站/百度一下百度一下你就知道
  • 做百度糯米网站的团队/网站seo关键词排名
  • wordpress制作上传图片/长春网站优化咨询
  • 158百事通做网站是诈骗吗/百度搜索引擎排行榜
  • 郑州hi宝贝网站建设公司/百度公司招聘官网
  • 织梦网站做seo优化/网站站点