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

Python串口间隔发送时无法向Arduino Nano传输数据

问题分析与解决:Arduino Nano串口延迟发送数据异常

核心问题点

你的代码存在两个关键问题,导致延迟发送时数据传输异常:

  1. newData标志未重置:Arduino代码中,收到结束符~后将newData设为true,但后续从未将其改回false,导致后续串口数据读取逻辑完全失效,无法处理新数据。
  2. 字符串未终止:receivedChars数组未添加字符串终止符'\0',Serial.println()输出时会读取到数组末尾的随机内存内容,甚至输出空内容。

另外,Arduino Nano在串口连接建立时会自动重启,若Python延迟发送数据,Arduino已发送READY字符串到缓冲区,未清空可能干扰后续读取,但这不是主要问题。

修正后的Arduino代码

#include <Servo.h>

bool newData = false;
char receivedChars[64];

void setup() {
  Serial.begin(9600);
  delay(1000);
  Serial.println("READY");
}

void loop() {
  static byte ndx = 0;
  char endMarker = '~';
  char rc;

  // 仅当无未处理数据时,读取串口数据
  while (Serial.available() && newData == false) {
    rc = Serial.read();
    if (rc != endMarker) {
      // 防止数组溢出
      if (ndx < sizeof(receivedChars) - 1) {
        receivedChars[ndx] = rc;
        ndx++;
      }
    } else {
      // 添加字符串终止符,确保Serial.println正常输出
      receivedChars[ndx] = '\0';
      ndx = 0;
      newData = true;
    }
  }

  // 处理并输出接收到的数据,之后重置标志
  if (newData) {
    Serial.println(receivedChars);
    newData = false;
  }
}

Python代码优化建议

添加串口缓冲区清空逻辑,避免Arduino重启时发送的READY字符串干扰后续读取:

import serial
import time
port = 'COM6' 
baudrate = 9600

# 打开串口连接
ser = serial.Serial(port, baudrate)
time.sleep(3)
# 清空串口缓冲区,移除Arduino重启时的残留数据
ser.flushInput()
data_to_send = "hello, world~"

data_bytes = data_to_send.encode('utf-8')
while True:
    ser.write(data_bytes)
    data = ser.readline()
    print("data", data)
    print(f"Data sent: {data_to_send}")
    # 可选:添加小延迟避免发送过于频繁
    time.sleep(0.1)

验证效果

修改后,无论Python是否添加time.sleep(3),都能正常接收并返回数据,输出会恢复为:

Data sent: hello, world~
data b'hello, world\r\n'
Data sent: hello, world~
data b'hello, world\r\n'
...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:05:15