Python与Arduino串口通信:判断字符串匹配执行任务问题求助
Arduino与Python串口通信稳定实现示例及问题排查
Arduino端代码(稳定接收版)
const int ledPin = 13; String receivedStr; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); // 等待串口就绪(适配部分自动重启的板型) while (!Serial) { ; } } void loop() { if (Serial.available() > 0) { // 读取到换行符为止,避免截断完整指令 receivedStr = Serial.readStringUntil('\n'); // 去除首尾空白(换行、空格等),避免格式干扰匹配 receivedStr.trim(); // 匹配指定字符串执行动作 if (receivedStr == "TURN_ON") { digitalWrite(ledPin, HIGH); Serial.println("LED已点亮"); // 回传确认信息,方便验证 } else if (receivedStr == "TURN_OFF") { digitalWrite(ledPin, LOW); Serial.println("LED已熄灭"); } // 清空缓存,避免残留旧数据影响下一次判断 receivedStr = ""; } }
Python端发送代码(基于pyserial)
先确保安装依赖:pip install pyserial
import serial import time # 串口参数需和Arduino完全匹配,端口号根据自身设备调整 ser = serial.Serial( port='COM3', # Windows一般是COMx,Linux/Mac是/dev/ttyUSB0或/dev/ttyACM0 baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) # 等待Arduino重启(串口连接时Uno会自动重启,需预留2-3秒缓冲时间) time.sleep(3) def send_command(cmd): # 追加换行符,和Arduino端的读取逻辑对齐 ser.write((cmd + '\n').encode('utf-8')) # 读取Arduino回传,验证指令是否被正确处理 response = ser.readline().decode('utf-8').strip() print(f"Arduino回应: {response}") # 测试指令 send_command("TURN_ON") time.sleep(2) send_command("TURN_OFF") ser.close()
常见问题排查思路
- 波特率不匹配:Python和Arduino的
baudrate必须完全一致,哪怕差一个数值都会导致乱码或接收失败。 - 串口端口错误:通过设备管理器(Windows)或
ls /dev/tty*(Linux/Mac)确认Arduino对应的端口,不要凭猜测填写。 - 忽略Arduino重启延迟:Python打开串口后,Uno会自动重启,直接发送数据会丢失第一帧,必须等待2-3秒再发送。
- 字符串格式不一致:两边要约定统一的结束符(比如换行
\n),Python发送时必须追加,Arduino用readStringUntil('\n')读取,同时用trim()清理空白字符,避免因格式差异导致匹配失败。 - 串口缓存残留:Arduino端每次处理完指令要清空接收字符串;Python端可在发送前调用
ser.flushInput()清空输入缓存。 - 硬件接触不良:更换质量可靠的USB线,避免因接触问题丢包;CH340芯片的板型要确保驱动安装正确。
- 用串口监视器验证:先通过Arduino自带的串口监视器发送指令,若LED触发仍不稳定,说明是Arduino代码问题;若监视器正常,则问题出在Python端。
内容的提问来源于stack exchange,提问作者Garberchov
相关产品推荐
相关产品推荐

