使用PySerial和Arduino忽略来自串行端口的某些数据用于ECG

时间:2014-02-18 14:43:12

标签: python arduino real-time pyserial

我正在使用带有Arduino Uno的PySerial模块。我在stackoverflow用户的帮助下能够生成一个针对ECG值的时间图(以伏特为单位)。但是,有一个问题。

当我通过将Arduino连接到我的计算机(通过USB)启动串行端口时,数据会自动开始流动。现在当我运行我的Python文件时,它会读取来自串口的当前值,然后再次重新启动为零(我希望它能做到)。我想忽略,刷新或任何适当的初始值。您可以在下面找到Arduino草图,Python代码和视频剪辑:

Arduino Sketch:

#include <eHealth.h>


unsigned long time;
// 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() {

  float ECG = eHealth.getECG();
  time = millis();
  Serial.print(time);
  Serial.print(" ");
  Serial.print(ECG, 3); 
  Serial.println(""); 


  delay(25);    // wait for 50 millisecond
}

Python:

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
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)

refreshMillis = 25
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])
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()

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

app.exec_()

ser.flush()
ser.close()

视频片段:

http://www.youtube.com/watch?v=dNpUakcRPec

当我运行上面显示的python文件时,左边列中的前几个值和右列中的电压值是来自端口的当前值,然后它们会重置,这可以在引起这种初期混乱的情节是我想要避免的。

1 个答案:

答案 0 :(得分:1)

为什么不直接从python脚本向arduino发送一个“启动信号”,告诉它开始发送?

void setup()添加一个while循环,直到你从电脑上接收“Start”然后开始发送。