USB集线器同时接RS232转USB设备与4G模块,是否会丢数据?
USB集线器下Sensor与4G模块并发传输的风险分析
核心结论
正常使用场景下,Sensor的数据不会轻易丢失,但存在极小概率的风险,下面具体拆解:
1. USB总线的隔离特性
USB本身是主从架构,树莓派作为主设备,USB集线器会把Sensor的FT232串口适配器和4G模块识别成两个完全独立的逻辑设备,各自拥有专属的传输端点。主控制器会通过轮询方式调度两个设备的数据传输,只要总线带宽够用,二者的数据不会混流,也不会互相干扰。
你的Sensor数据速率极低:19200波特率换算下来,每秒最多传输1920字节(每个字节含起始位+8数据位+停止位,共10位),而树莓派Zero 2W的USB是2.0规格,理论带宽480Mbps,哪怕4G模块有数据传输,只要不是持续满负载跑,完全能轻松容纳Sensor的小流量数据。
2. 可能导致丢数的极端场景
虽然概率极低,但以下情况可能引发Sensor数据丢失:
- USB总线被占满:如果4G模块持续高速传输(比如大文件上传),把USB总线带宽耗尽,主控制器可能暂时顾不上FT232的传输请求。此时FT232的内部缓冲区(一般是128或256字节)如果被填满,新到的数据就会被覆盖。但你的Sensor每分钟才发一组数据,数据量极小,这种情况几乎不会发生。
- FT232缓冲区溢出:你代码里的
time.sleep(1)会让程序暂停1秒,这段时间如果Sensor发送了数据,FT232的缓冲区会暂存,但如果数据量超过缓冲区大小(比如Sensor突发发一堆数据),才会溢出。不过根据描述Sensor每分钟一组,这个风险也可以忽略。 - 串口读取逻辑的小瑕疵:你用
ser.read(1)阻塞等待第一个字节,然后sleep1秒再读剩余数据。如果Sensor的数据是一次性发完的,这个逻辑没问题,但如果数据分批次间隔发送,sleep1秒可能会错过后续数据?不过因为Sensor每分钟一组,应该是一次性发完,所以目前逻辑没问题,但可以优化掉sleep,让读取更高效。
代码优化建议
把代码里的time.sleep(1)去掉,换成更高效的读取方式,能进一步降低缓冲区溢出的可能:
import serial from serial.tools import list_ports import time # 查找FT232设备 available_ports = list(list_ports.comports()) target_port = None for port in available_ports: if port.interface == "FT232R USB UART": target_port = port.device break if not target_port: raise Exception("没找到FT232R USB UART设备") # 初始化串口 ser = serial.Serial( target_port, baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=2, # 设置2秒超时,避免程序一直卡着 xonxoff=False, rtscts=False, ) try: # 循环监听数据 while True: sensor_data = b"" # 读取所有当前可用的数据 while ser.in_waiting > 0: sensor_data += ser.read(ser.in_waiting) time.sleep(0.01) # 等10ms确保数据全部到齐 if sensor_data: print("收到Sensor数据:", sensor_data) # 这里加你的数据记录逻辑 time.sleep(1) # 轮询间隔,可根据需求调整 finally: ser.close()
优化点:
- 增加了设备未找到的异常提示,避免程序静默失败
- 设置
timeout=2,防止ser.read()永久阻塞 - 循环读取所有缓冲区数据,替代原来的
read(1)+sleep,更高效且不会遗漏数据 - 用
try-finally确保程序退出时串口能正常关闭
总结
总的来说,你的场景下Sensor丢数的概率非常低,原因有三:
- Sensor数据速率极低,USB总线完全能承载
- 集线器会隔离两个设备的传输,不会互相干扰
- 4G模块除非持续满带宽传输,否则不会影响Sensor的小批量数据
如果想更稳妥,可以:
- 用带独立供电的USB集线器(树莓派Zero 2W的USB口供电有限,避免设备供电不足导致传输异常)
- 用上边优化后的代码,及时读取缓冲区数据
内容的提问来源于stack exchange,提问作者Isaia Ismaele




