一、串口通信基础:串口通信原理、RS232/RS485/TTL电平区别、波特率/数据位/停止位/校验位详解

各位同学,咱们今天聊聊串口通信。说实话,这玩意儿是我做嵌入式这些年打交道最多的接口,没有之一。你想想看,从单片机调试到Android设备的外设联调,串口几乎无处不在。我刚开始做硬件那会儿,就因为在电平匹配上栽过跟头,烧了一块开发板——嗯,这事儿后面细说。

1.1 串口通信原理:说白了就是“一根线发,一根线收”

串口通信,全称叫串行通信接口。它的核心思想很简单:数据按位(bit)逐个传输。不像并行通信那样一次传8位或16位,串口一次只传1位,但胜在连线少、成本低、抗干扰能力强。

我习惯把串口通信比作两个人打电话。你一句我一句,不能同时说,否则就乱套了。串口也是这样,它需要约定好“说话”的节奏——这就是后面要讲的波特率。

串口通信的三要素:

  • 物理层:用什么电平、几根线(TX、RX、GND)
  • 协议层:数据怎么打包(起始位、数据位、校验位、停止位)
  • 时序层:以什么速率传输(波特率)

实际项目中,串口最常见的应用场景就是调试日志输出与传感器/外设通信。我在做Android车载系统时,中控屏和MCU之间就是通过串口交互的,波特率115200,稳定跑了两年没出过问题。

1.2 RS232 / RS485 / TTL 电平区别:别搞混了,会烧板子的

这是新手最容易踩坑的地方。三种电平标准,长得像,但脾气完全不同。

特性 TTL电平 RS232电平 RS485电平
逻辑1(高电平) 3.3V 或 5V -3V ~ -15V 差分电压(A-B > +0.2V)
逻辑0(低电平) 0V +3V ~ +15V 差分电压(A-B < -0.2V)
传输距离 几米以内 约15米 可达1200米
通信方式 单端(共地) 单端(共地) 差分(双绞线)
典型电压范围 0 ~ 5V ±12V ±5V 差分

TTL电平:这是单片机、开发板、Android设备内部用的。3.3V或5V代表1,0V代表0。简单直接,但抗干扰差,线长了就不行。

RS232电平:这是老式电脑串口(DB9接口)用的。它把逻辑反过来:-12V是1,+12V是0。为什么要这样?为了抗干扰。电压摆幅大,传输距离比TTL远。但注意,TTL和RS232不能直连,必须用电平转换芯片(比如MAX232)。

我曾经犯过的错:刚入行时,我把一个TTL电平的GPS模块直接接到了电脑的RS232串口上。结果你猜怎么着?模块冒烟了。因为RS232的±12V直接灌进了3.3V的芯片引脚。从那以后,我每次接线前都会用万用表先量一下电平。

RS485电平:这是工业现场的王牌。它用差分信号传输,两根线(A和B)的电压差来表示数据。抗干扰能力极强,支持多节点通信(一主多从)。我在做智能楼宇项目时,几十个传感器就是通过RS485总线连到网关的,距离超过500米,一点问题没有。

我的建议:

  • 板级调试(1米以内):用TTL,简单方便
  • 电脑连接(10米以内):用RS232,加个转换器
  • 工业现场(百米以上):用RS485,必须用双绞线

1.3 波特率 / 数据位 / 停止位 / 校验位详解

这四个参数,是串口通信的“四件套”。两端必须设置完全一致,否则收到的全是乱码。我在项目中见过太多人因为波特率不匹配,折腾半天找不到原因。

1.3.1 波特率:通信的“语速”

波特率表示每秒传输的比特数,单位是bps(bits per second)。常见的值有:9600、19200、38400、115200、921600。

怎么选?我个人的经验是:

  • 调试用:115200,速度够快,大部分设备都支持
  • 长距离或干扰大:9600或19200,速度慢但稳定
  • 高速数据传输:921600甚至更高,但要注意线材质量和距离

你想想看,如果发送端说“我每秒说115200个字”,接收端却以为“我每秒只听得懂9600个字”,那不乱套了吗?所以波特率必须一致

1.3.2 数据位:一次传多少数据

数据位表示每个数据包中实际数据的位数。常见的是8位,也有7位、5位的情况。

  • 8位:最常用,一个字节(0-255),适合传输二进制数据或ASCII字符
  • 7位:老式设备用,ASCII字符只需要7位(0-127)
  • 5位或6位:极少见,某些特殊协议用

我建议:默认选8位。除非你明确知道对方设备要求7位,否则别动它。

1.3.3 停止位:一句话说完的“句号”

停止位表示一个数据包传输结束后的空闲时间。常见的是1位、1.5位、2位。

  • 1位停止位:最常用,效率高
  • 2位停止位:给接收端更多时间处理数据,适合低速设备或干扰大的环境
  • 1.5位:很少见,某些特殊场景用

嗯,这里要注意:停止位越长,传输效率越低,但可靠性越高。我一般默认用1位,如果通信不稳定再改成2位试试。

1.3.4 校验位:数据对不对?查一下

校验位用于检测数据传输过程中有没有出错。常见的有:

  • 无校验(None):不校验,效率最高
  • 奇校验(Odd):数据位+校验位中1的个数为奇数
  • 偶校验(Even):数据位+校验位中1的个数为偶数
  • 标记校验(Mark):校验位固定为1
  • 空格校验(Space):校验位固定为0

我个人的习惯是:调试阶段用无校验,省事;正式产品用偶校验,能检测单比特错误。奇校验也行,但偶校验更常见。

一个典型配置示例:

波特率:115200
数据位:8
停止位:1
校验位:无
简称:115200 8N1

这是最常用的配置,80%以上的串口设备默认就是这个。

1.4 实战经验:串口调试的“三板斧”

说了这么多理论,来点实际的。当你在Android设备上调试串口时,遇到问题怎么办?我总结了三步:

  1. 先查硬件:用万用表量TX、RX引脚电压。TTL空闲时应该是高电平(3.3V或5V),如果量出来是0V,说明没上电或者引脚配置错了。
  2. 再查配置:确认波特率、数据位、停止位、校验位是否匹配。用示波器看波形最直观,没有示波器就用逻辑分析仪。
  3. 最后查软件:Android端的串口权限、文件描述符、读写线程是否正常。我遇到过好几次,硬件没问题,但APP里忘了打开串口设备。

避坑指南:我曾经在一个项目中,串口通信时好时坏。折腾了两天,最后发现是TX和RX线接反了。对,就是这么低级。所以,接线前先确认TX接RX,RX接TX,交叉连接,别直连。

好了,这一章的内容就到这里。串口通信看似简单,但细节很多。下一章我们会讲Android端如何操作串口设备,包括打开、配置、读写,以及常见的权限问题。到时候我会拿一个实际项目中的代码来演示,保证干货满满。