You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:03:17