【问题标题】:Sending a character to the Arduino serial port using Python's Pyserial使用 Python 的 Pyserial 向 Arduino 串口发送一个字符
【发布时间】:2026-01-10 16:35:05
【问题描述】:

我已经设置了一个 Arduino 以在它接收到“S”字节时发送数据。这适用于 Arduino 串行监视器。但是,我在 Python 上绘制数据,使用 Pyserial 联系串行端口。这是我的 Arduino 草图,以明确我在说什么:

#include <eHealth.h>


unsigned long time;
unsigned long interval = 8;
byte serialByte;

// The setup routine runs once when you press reset:
void setup() {
  Serial.begin(9600);  
}

// The loop routine runs over and over again forever:
void loop() {
  if(Serial.available()>0){
    serialByte = Serial.read();
    if(serialByte == 'S'){  
      while(1){
        float ECG = eHealth.getECG();
        time = time + interval;
        Serial.print(time);
        Serial.print(" ");
        Serial.print(ECG, 3); 
        Serial.println("");

        if(Serial.available()>0){
          serialByte = Serial.read();
          if (serialByte == 'F') break;
        }
      }
    }
  }
  delay(interval);
}

正如我所说,这很好用。但是当我尝试这个时在 Python 上:

import serial
ser = serial.Serial('/dev/tty.usbmodem1411', 9600)
ser.write(bytearray('S','ascii'))

或者这个:

import serial
ser = serial.Serial('/dev/tty.usbmodem1411', 9600)
ser.write('S')

arduino 出于某种原因没有收到它,并且数据没有通过串行端口流向 Python。我不知道问题所在。如您所见,我已尝试转换为字节,但仍然无法正常工作。

这是我的完整 Python 代码:

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg, NavigationToolbar2QTAgg
import matplotlib.figure as mfig
import PyQt4.QtGui as gui, PyQt4.QtCore as core
import collections
import time
import random

import serial
ser = serial.Serial('/dev/tty.usbmodem1411', 9600)
ser.write('S')


refreshMillis = 8
N = 200
xs = collections.deque(maxlen=N)
ys = collections.deque(maxlen=N) 

app = gui.QApplication([])

fig = mfig.Figure()
canvas = FigureCanvasQTAgg(fig)

ax = fig.add_subplot(111)
ax.set_ylim([0,5])
# ax.title("Arduino Electrocardiogram")
ax.set_xlabel("Time (ms)")
ax.set_ylabel("Voltage (V)")
line2D, = ax.plot(xs,ys)
canvas.show()


def process_line():
    line = ser.readline()
    data = map(float,line.split(" "))
    xs.append(data[0])
    ys.append(data[1])
    line2D.set_data(xs,ys)
    print data
    xmin, xmax = min(xs),max(xs)
    if xmin == xmax:
        ax.set_xlim([xmin,xmin+1])
    else:
        ax.set_xlim([xmin,xmax])
    canvas.draw()

    zipString = zip(xs,ys)
    f = open("plot_store","w")
    for line in zipString:
        f.write(" ".join(str(x) for x in line) + "\n")
    f.close()




timer = core.QTimer()
timer.timeout.connect(process_line)
timer.start(refreshMillis)

app.exec_()

ser.flush()
ser.close()

【问题讨论】:

  • 黑暗中的一枪:你有没有试过在拨打ser.write('S')后立即拨打ser.flush()
  • 欣赏这个建议,但没有什么不同,我只是弹出了图形窗口和轴,但没有绘制值。
  • 嗯,值得一试。为了进一步调试,我建议创建一个更简单的示例,删除所有 Qt 和 Matplotlib 内容。在担心绘图和 GUI 内容之前,先用一个简单的脚本弄清楚 I/O。

标签: python serialization matplotlib serial-port


【解决方案1】:

当我开始使用 Arduino 序列时,这让我很着迷。当您打开串行连接(例如通过 Python)时,Arduino 会重置,缺少接下来的几个字符。

我通常会这样做:

ser = serial.Serial('COM6', 9600)
time.sleep(3)
ser.write('Hello world')

希望对您有所帮助。

【讨论】:

  • 谢谢...这似乎已经为我解决了。令人困惑的是,当调用 Serial() 时,Arduino (Nano) 会收到一个“M-x”字符。睡后一切似乎都很好。有什么想法吗?
  • 如果您启用自动重置,那么您将在打开串行后两种方式都得到垃圾。最好的选择是在软件中处理(通过忽略这些字节)或禁用这样的自动重置......playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection