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

Python向Arduino Uno发送数字字符串异常问题求助

问题:Python向Arduino Uno发送硬编码数字字符串无响应,仅input输入有效

我有C#、C++开发经验,现在需要向Arduino Uno发送数字字符串。参考官网示例适配后无法正常工作,Arduino无数据返回。排查后发现:通过input()输入数字字符串发送时代码正常运行,直接写死字符串发送则完全失效。

无响应代码

import serial
import time
arduino = serial.Serial(port='COM6', baudrate=115200)

arduino.write(bytes("88", 'utf-8'))
time.sleep(0.05)
data = arduino.readline()
print(data)
arduino.close()

正常工作代码

import serial
import time
arduino = serial.Serial(port='COM6', baudrate=115200)

arduino.write(bytes(input("num"), 'utf-8'))
time.sleep(0.05)
data = arduino.readline()
print(data)
arduino.close()

Arduino端代码

int x; 
void setup() { 
    Serial.begin(115200); 
} 
void loop() { 
    while (!Serial.available()); 
    x = Serial.readString().toInt(); 
    Serial.println(x + 1); 
} 

我尝试过指定utf-8编码、用struct.pack,都无效,Arduino仅能识别input()发送的数据,求解决方法。


解决方案

问题核心:Arduino的readString()默认会一直等待**换行符\n**作为数据结束标记才会停止读取。你用input()输入时,按下回车会自动在字符串末尾添加换行符,而硬编码的"88"没有这个终止符,导致Arduino的readString()一直阻塞,无法执行后续的返回逻辑。

提供两种解决思路:

思路1:Python端添加换行符

直接在硬编码字符串末尾加上\n,让Arduino识别数据结束:

arduino.write(bytes("88\n", 'utf-8'))

思路2:Arduino端修改读取逻辑

如果不想依赖换行符,可以改用readBytes()读取固定长度字符,或者用readStringUntil()指定自定义终止符。示例代码:

void loop() { 
    while (!Serial.available()); 
    char buf[3];
    Serial.readBytes(buf, 2); // 读取2个字符(对应"88"的长度)
    buf[2] = '\0'; // 手动添加字符串结束符
    x = atoi(buf); 
    Serial.println(x + 1); 
} 

额外注意事项

Python初始化串口后,最好加2秒左右的延时——Arduino串口连接时会自动重启,过早发送数据可能导致丢失:

arduino = serial.Serial(port='COM6', baudrate=115200)
time.sleep(2) # 等待Arduino重启完成

内容的提问来源于stack exchange,提问作者WIIC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:04:52