You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Arduino与Python双向串口通信异常:发送命令后无法接收返回数据

Arduino与Python双向串口通信异常:发送命令后无法接收返回数据

看起来你已经走对了方向,只是串口通信的细节没处理好——毕竟串口对数据格式和读取逻辑挺敏感的。我帮你梳理几个关键问题,再给你修改后的代码试试:

问题根源分析

  1. Arduino端的输出冗余且格式不匹配
    你现在收到命令后,先打印了命令内容,又额外写了"command\n",最后才发送单个字节的1/0。这些多余的输出会打乱返回数据的结构,而且最后那个1/0是字节值(不是字符串"1"),还没有换行符,Python用readline()会一直等待换行,超时后就判定为没收到数据。
  2. Python端的读取逻辑不够高效
    额外的time.sleep(4)没必要,反而可能错过数据读取的时机;而且你初始化串口后没有清空输入缓冲区,之前残留的垃圾数据可能干扰这次通信。

修改后的代码

Arduino代码(简化输出,统一格式)

void setup() {
  Serial.begin(9600);
  delay(1000); // 给串口初始化留足够时间
}

void loop() {
  if (Serial.available() > 0) {
    String command = Serial.readStringUntil('\n');
    command.trim(); // 去掉字符串两端的空格、换行等残留字符
    // 只返回我们需要的结果,用println自动加换行,方便Python用readline读取
    if (command == "test") {
      Serial.println(1);
    } else {
      Serial.println(0);
    }
    Serial.flush(); // 确保所有数据都发送到串口
  }
}

Python代码(优化读取逻辑)

import serial

def testcomm(test):  
    out = 0
    # 初始化串口,设置2秒超时足够响应
    capt = serial.Serial('COM5', 9600, timeout=2)
    capt.flushInput() # 清空输入缓冲区,避免之前的残留数据干扰
    com = (test + '\n').encode()
    print(f"Commande envoyée : {com}")
    capt.write(com)
    
    # 直接读取一行,因为Arduino用println返回,自带换行符
    testout = capt.readline()
    if testout:
        # 把字节转成字符串,再去掉多余的换行/空格
        out = testout.strip().decode('utf-8')
        print(f'testout val (cleaned): {out}')
    else:
        print("Doesn't work")
    
    capt.close()
    return out

test1 = testcomm('test')
print(f"最终返回结果: {test1}")

额外排查建议

  • 先关闭Arduino IDE的串口监视器再运行Python代码,同一个串口不能被两个程序同时占用;
  • 确认设备管理器里Arduino的端口号确实是COM5,有时候插拔USB会导致端口号变化;
  • 检查USB线是否插紧,劣质的USB线可能导致通信不稳定;
  • 如果还是有问题,可以在Python里先打印capt.in_waiting的值,看看有没有数据到达缓冲区,帮你定位是发送还是接收的问题。

备注:内容来源于stack exchange,提问作者Tsuyo

火山引擎 最新活动