4、通信接口测试:USB枚举与读写测试、串口环回测试、以太网Ping与吞吐量测试

通信接口,说白了就是POS机和外界打交道的「嘴巴」。你想想看,一台POS机如果连不上网、读不了U盘、串口乱码,那基本就是个砖头。量产测试里,这块儿是故障率最高的区域之一。我见过不少板子,功能逻辑全对,就是死在接口上,最后查出来是焊接虚焊或者静电打坏了PHY芯片。

今天咱们就把这三个最关键的接口——USB、串口、以太网——的测试方法掰开揉碎讲清楚。嗯,这里要注意,测试不是为了测而测,是为了在产线上快速揪出「坏孩子」。

4.1 USB枚举与读写测试

USB接口在POS机上通常有两个角色:一是插U盘升级固件或导数据,二是作为Device口连电脑调试。量产测试时,我们主要测Host模式,也就是插U盘那个口。

测试目标:确认USB Host能正确枚举设备,并且读写文件不出错。

我的做法是这样的:

  1. 准备一个标准测试U盘——最好是4GB或8GB的,格式化成FAT32。别用太大容量,产线不需要测极限。
  2. U盘里放一个固定文件,比如叫 testfile.bin,大小控制在1MB左右,内容可以是全0x55或者随机数,方便后面校验。
  3. 上电后,让POS机自动检测U盘插入。检测到后,先读文件,再写一个新文件进去,最后比对MD5或CRC32。

这里有个坑:有些劣质U盘或者USB座子接触不良,会导致枚举成功但读写失败。我曾经遇到过一批板子,USB口能识别U盘,但一读文件就卡死,最后发现是D+、D-差分线走线太长,信号质量不行。

核心判断标准:

  • 枚举时间 < 3秒(从插入到设备节点出现)
  • 读写速度 > 5MB/s(全速USB理论12Mbps,实际够用就行)
  • 文件校验100%通过

代码示例(基于Linux嵌入式环境):

#!/bin/sh
# USB读写测试脚本
TEST_FILE="/mnt/usb/testfile.bin"
MD5_ORIG="a1b2c3d4e5f6..."  # 预计算的原始MD5

# 挂载U盘
mount /dev/sda1 /mnt/usb
if [ $? -ne 0 ]; then
    echo "FAIL: USB mount failed"
    exit 1
fi

# 读取并校验
md5_read=$(md5sum $TEST_FILE | awk '{print $1}')
if [ "$md5_read" != "$MD5_ORIG" ]; then
    echo "FAIL: Read data mismatch"
    umount /mnt/usb
    exit 2
fi

# 写入新文件
echo "PASS: USB enumeration & read test"
dd if=/dev/urandom of=/mnt/usb/write_test.bin bs=1024 count=1024
sync
umount /mnt/usb
echo "PASS: USB write test"

小技巧:产线上可以用一个USB Hub同时测多个口,但注意Hub本身不能引入额外故障。我习惯在测试治具上固定一个「金标准」U盘,每测1000次换一次,避免U盘本身老化。

4.2 串口环回测试

串口这东西,看着简单,其实最容易出幺蛾子。波特率不对、电平不匹配、TX/RX焊反……我刚开始带产线时,有一批板子串口怎么都调不通,折腾了两天,最后发现是RS232电平转换芯片的使能脚没拉高。你说冤不冤?

测试原理:把串口的TX和RX短接,发一串数据,看收回来的是不是一模一样。这叫「环回测试」,硬件上只需要一个跳线帽或者继电器。

具体步骤:

  1. 硬件上把DB9头的2脚(RX)和3脚(TX)短接。如果是TTL电平,直接短接板上的测试点。
  2. 软件上以固定波特率(通常是115200)发送一个已知数据包,比如64字节的0xAA、0x55交替。
  3. 接收并比对,如果完全一致,则PASS;否则FAIL。

你可能会问:为什么不测所有波特率?没必要。量产测试讲究效率,测一个常用波特率就够了。如果硬件有晶振偏差,所有波特率都会偏,测一个就能暴露问题。

测试项 参数 判定标准
波特率 115200 无错码
数据位 8 固定
校验位 固定
停止位 1 固定
发送数据 64字节 0xAA55交替 100%匹配
# 串口环回测试(Python示例)
import serial
import time

ser = serial.Serial('/dev/ttyS0', 115200, timeout=2)
test_data = bytes([0xAA, 0x55] * 32)  # 64字节

ser.write(test_data)
time.sleep(0.1)  # 等数据发完

received = ser.read(64)
if received == test_data:
    print("PASS: UART loopback test")
else:
    print("FAIL: UART mismatch")
    print(f"Sent: {test_data.hex()}")
    print(f"Recv: {received.hex()}")

ser.close()

注意:环回测试只能验证串口硬件通路,不能验证对端设备。如果产线上需要测实际通信,建议再加一个「短应答测试」——发一个AT指令,等设备回OK。不过那是功能测试的范畴了。

4.3 以太网Ping与吞吐量测试

以太网测试分两层:通不通(Ping)和快不快(吞吐量)。量产线上,我建议先做Ping,快速筛掉物理层故障;再做吞吐量,筛掉驱动或PHY配置问题。

Ping测试:

说白了就是发一个ICMP包,看对方回不回。产线上我们会搭一个专用的测试服务器,IP固定为192.168.1.100。POS机上电后自动Ping这个地址,丢包率必须为0,延迟不超过10ms。

我曾经遇到一个案例:Ping偶尔丢包,但又不是每次都丢。查了半天,发现是网口变压器的中心抽头没接对,导致共模噪声干扰。这种问题,光靠Ping还不行,得用示波器看眼图。

吞吐量测试:

这个更狠。我们用iperf工具,在测试服务器上开服务端,POS机上跑客户端,打满带宽跑10秒钟。对于百兆以太网,实际吞吐量至少要到90Mbps以上才算合格。

# 测试服务器(192.168.1.100)
iperf -s -i 1

# POS机客户端
iperf -c 192.168.1.100 -t 10 -i 1

输出示例:

------------------------------------------------------------
Client connecting to 192.168.1.100, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  3] local 192.168.1.200 port 45678 connected with 192.168.1.100 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  112 MBytes   94.0 Mbits/sec

量产判定标准:

  • Ping:10次,0%丢包,平均延迟 < 5ms
  • 吞吐量:百兆口 > 90Mbps,千兆口 > 800Mbps
  • 如果连续3次测试不达标,直接判FAIL,进入维修流程

嗯,这里要补充一句:吞吐量测试对产线网络环境要求比较高。如果交换机上有广播风暴或者线缆质量差,测出来的数据就不准。我建议在测试工位单独拉一根网线,不要和办公网混在一起。

小结

通信接口测试,说白了就是三板斧:USB看枚举和读写,串口看环回,以太网看Ping和吞吐量。这三项过了,基本能保证POS机跟外界「说话」的能力没问题。但别忘了,测试治具本身也要定期校准——U盘会坏,串口线会断,网口会氧化。产线上最怕的不是产品坏,而是测试设备坏了你还不知道。

下一章咱们聊聊「音频与打印功能测试」,那个更有意思,尤其是打印机的热敏头,测起来门道不少。