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
相关产品推荐
相关产品推荐

