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

Arduino与Python3串口通信问题:Python向Arduino发送字节失败

Python与Arduino串口通信问题排查与修复

我来帮你解决Python向Arduino发送数字时遇到的串口通信问题。看了你的代码,发现几个需要调整的细节,同时Arduino的接收逻辑也需要补全,下面一步步来:

一、Python代码的优化与问题点

你的Python代码存在几个潜在问题,比如串口初始化的方式、缺少Arduino重启等待时间,这里给出优化后的版本:

原代码问题分析

  • 串口初始化时未直接指定波特率,虽然后续设置了,但构造时直接传入更稳妥
  • Arduino连接串口后会自动重启,立刻发送数据大概率会丢失
  • 可以合并发送操作,简化代码

优化后的Python代码

import serial
import time

# 初始化串口时直接指定波特率,同时设置超时避免阻塞
ser = serial.Serial('/dev/ttyACM0', baudrate=115200, timeout=1)
time.sleep(2)  # 等待Arduino完成重启和初始化,这一步非常关键

# 直接发送带换行符的数字字节串,确保Arduino能识别完整数据
ser.write(b'3\n')
ser.close()  # 使用完毕后关闭串口,避免资源占用

二、Arduino代码的补全与接收逻辑

你的Arduino代码只写了setup部分,缺少核心的串口接收逻辑,而且舵机对象未定义,这里给出完整的可运行代码:

#include <Servo.h>

Servo servomotore;  // 定义舵机对象,之前的代码里漏掉了这一步

void setup(){
  Serial.begin(115200);
  servomotore.attach(3);
  pinMode(2, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  
  // 初始化输出引脚为低电平,避免状态混乱
  digitalWrite(2, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
}

void loop(){
  // 检查串口是否有数据到来
  if(Serial.available() > 0){
    // 读取到换行符为止的字符串,确保拿到完整的一条数据
    String receivedStr = Serial.readStringUntil('\n');
    // 将字符串转换为整数
    int receivedNum = receivedStr.toInt();
    
    // 打印接收到的数字,方便通过串口监视器调试
    Serial.print("Received number: ");
    Serial.println(receivedNum);
    
    // 这里可以根据接收的数字执行对应操作,比如控制舵机或LED
    if(receivedNum == 3){
      servomotore.write(90);  // 舵机转到90度位置
      digitalWrite(13, HIGH); // 点亮13号板载LED
    } else {
      digitalWrite(13, LOW);  // 未收到3时关闭LED
    }
  }
  delay(100); // 小延时避免频繁检测串口,降低资源消耗
}

三、关键注意事项

  • 波特率必须完全一致:Python和Arduino的波特率都要设为115200,任何一方写错都会导致通信失败
  • 务必等待Arduino重启:Python里的time.sleep(2)不能省,Arduino连接USB串口后会自动重启,需要时间完成初始化
  • 统一数据格式:发送时带换行符,接收时用readStringUntil('\n'),确保每次读取完整的一个数字,避免只读到部分字符
  • 调试技巧:打开Arduino的串口监视器,查看打印的接收内容,能快速判断是发送端还是接收端的问题

内容的提问来源于stack exchange,提问作者Antonio Del Cogliano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:22:31