第1章:串口通信基础——RS232与UART协议、波特率与校验位、Python的pySerial库详解
1.1 从UART到RS232,到底有什么区别?
做TWS耳机产测,串口通信是绕不开的坎。我刚开始接触这个领域时,也搞混过UART和RS232的关系。说白了,UART是一种通信协议,而RS232是它的电气层标准。
UART全称是通用异步收发传输器。它只定义了数据怎么打包、怎么传输,但没规定电压是多少。而RS232规定了:逻辑1用-3V到-15V表示,逻辑0用+3V到+15V表示。你想想看,这跟单片机直接输出的0-3.3V电平完全不搭边。
我在项目中遇到过一个问题:用USB转串口线直接连TWS耳机充电仓,死活收不到数据。后来才发现,充电仓用的是TTL电平(0-3.3V),而我的转换器是RS232电平。嗯,这里要注意——产测中绝大多数设备用的是TTL电平,不是RS232。
关键区别速查:
- UART:协议层,定义数据帧格式
- RS232:物理层,定义电压标准(±3V~±15V)
- TTL:另一种物理层,0-3.3V或0-5V
- 产测场景:90%以上用TTL电平的UART
1.2 波特率与校验位——别小看这两个参数
波特率,就是每秒传输的符号数。常见的值有9600、115200、921600。我个人的习惯是:产测环境优先用115200。为什么?9600太慢,921600对线材和干扰太敏感。
校验位呢?有奇校验、偶校验、无校验三种。我建议产测中一律用无校验。为什么?因为校验位只能检测奇数个比特的错误,而且会降低有效数据率。真正的数据完整性,应该靠上层的CRC或校验和来保证。
我的经验:产测中如果遇到乱码,先别急着怀疑校验位。90%的情况是波特率不匹配,或者接地没接好。我曾经花了一整天排查一个"校验位问题",最后发现是GND线虚焊了。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 波特率 | 115200 | 产测场景平衡速度和稳定性 |
| 数据位 | 8 | 标准配置,兼容性最好 |
| 校验位 | None | 上层协议做校验更可靠 |
| 停止位 | 1 | 够用,除非特殊要求 |
1.3 Python的pySerial库——产测的瑞士军刀
pySerial是Python操作串口的标准库。我几乎每个产测项目都会用到它。安装很简单:
pip install pyserial
基本用法,我直接上代码:
import serial
import serial.tools.list_ports
# 1. 列出所有可用串口
ports = serial.tools.list_ports.comports()
for port in ports:
print(f"端口: {port.device}, 描述: {port.description}")
# 2. 打开串口
ser = serial.Serial(
port='COM3', # Windows下是COM口,Linux下是/dev/ttyUSB0
baudrate=115200,
bytesize=8,
parity='N', # N:无校验, E:偶校验, O:奇校验
stopbits=1,
timeout=1 # 读取超时,单位秒
)
# 3. 发送数据
ser.write(b'\xAA\x55\x01\x02\x03') # 发送十六进制数据
ser.write(b'AT\r\n') # 发送ASCII命令
# 4. 读取数据
data = ser.read(10) # 读取10个字节
line = ser.readline() # 读取一行,直到换行符
all_data = ser.read_all() # 读取所有可用数据
# 5. 关闭串口
ser.close()
注意:打开串口前一定要确认端口没有被其他程序占用。我曾经在产测脚本里忘了关串口,第二次运行直接报错"端口被占用"。建议用with语句自动管理:
with serial.Serial('COM3', 115200, timeout=1) as ser:
ser.write(b'test')
data = ser.read(10)
1.4 实战:TWS耳机产测中的串口通信流程
在TWS耳机产测中,串口通信的典型流程是这样的:
- 扫描端口:自动识别设备连接的串口号
- 建立连接:以115200-8-N-1的参数打开串口
- 发送指令:比如查询固件版本、触发测试模式
- 接收数据:解析返回的测试结果
- 异常处理:超时重试、错误重发
我建议把串口通信封装成一个类,方便复用:
class TWSComm:
def __init__(self, port, baudrate=115200):
self.ser = serial.Serial(port, baudrate, timeout=2)
def send_cmd(self, cmd):
"""发送指令并等待响应"""
self.ser.write(cmd.encode() + b'\r\n')
return self.ser.readline().decode().strip()
def close(self):
self.ser.close()
避坑指南:我曾经在产测线上遇到过一个问题——设备返回的数据偶尔会丢字节。排查了很久,发现是USB转串口线的驱动问题。后来统一换成了FTDI芯片的转换器,问题就解决了。所以,产测用的串口硬件,建议选FTDI或CP2102芯片的,别贪便宜买杂牌。
1.5 本章小结
串口通信是TWS耳机产测的基石。你需要记住三点:
- UART是协议,RS232/TTL是电平标准,产测用TTL
- 波特率115200、8数据位、无校验、1停止位是黄金组合
- pySerial库要熟练使用,特别是端口扫描和异常处理
下一章,我们会深入讲解如何用pySerial实现产测中的自动重连和流量控制。到时候我会分享一个我踩过的坑——关于串口缓冲区溢出的问题,保证让你少走弯路。