Python Serial.write()发送数据Arduino无法接收问题排查
问题排查结论
代码存在5个明确问题,逐一修复即可正常通信:
- 缺失依赖导入:代码中调用了
time.sleep()但开头未导入time模块,运行时会直接抛出NameError异常,无法执行到后续读串口逻辑 - 串口时序错误:pyserial打开串口的瞬间会触发Arduino自动硬件复位,整个复位启动流程需要1.5~2秒,打开串口后立刻发送数据会直接被正在启动的Arduino丢弃,根本无法被接收
- 休眠参数错误:
time.sleep(200)代表程序会休眠200秒(约3分半),发送完指令后程序直接卡住三分钟才进入读数据逻辑,Arduino返回的回显数据要么溢出串口缓冲区丢失,要么因超时被清空 - 波特率不匹配风险:Python端设置的2000000波特率属于非标准值,必须和Arduino固件中
Serial.begin()传入的波特率参数完全一致,否则会出现完全收不到数据、返回乱码的问题 - 数据切片逻辑错误:
ser.readline()[:-2]默认强制切掉返回数据的最后2位,若Arduino返回的数据长度不足2位、或者换行符格式不匹配,会直接把有效数据切掉,甚至触发切片运行错误
修正后代码
import serial import time # 波特率请替换为Arduino端Serial.begin()设置的实际值,常见值为9600、115200 ser = serial.Serial('/dev/cu.usbmodem1411', 115200, timeout=1) # 等待Arduino复位完成再发指令 time.sleep(2) ser.write(b'H') while True: data = ser.readline() if data: # 自动去除首尾换行、空白字符后解码,避免无效切片 print(data.strip().decode(errors='ignore'))
额外验证提示
如果修改后仍无输出,先打开Arduino IDE的串口监视器,确认波特率选择和代码中一致,能正常收到Arduino返回的内容后,再关闭串口监视器运行Python脚本——注意串口同一时间只能被一个程序占用,开着串口监视器的时候Python脚本是打不开串口的。
内容的提问来源于stack exchange,提问作者nerd
相关产品推荐
相关产品推荐

