我已经设置了一个Arduino在接收到“ S”字节时发送数据。这适用于Arduino串行监视器。但是,我正在使用Pyserial在Python上绘制数据,以联系串行端口。这是我的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()
当我开始使用Arduino serial时,这让我感到震惊。当您打开串行连接(例如通过Python)时,Arduino重置,缺少接下来的几个字符。
我通常会做类似的事情:
ser = serial.Serial('COM6', 9600)
time.sleep(3)
ser.write('Hello world')
希望能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句