在社区的帮助下,我能够为matplotlib安装新的后端,并将代码从Arduino序列运行到python窗口的输出。
然后我能够创建一个漂亮的图形并显示,但是当我收到以下错误时崩溃:
属性错误:' str'对象没有属性' inWaiting'
这是在@elethan
的帮助下解决的但是,我现在有错误:
pulse = float(dataArray[0])
ValueError: could not convert string to float:
每次都不会发生此错误
好像这还不够,绘制图表上的输出显示大部分绘图的值为10,这不是Arduino序列的输出值。
我不确定为什么: 1)错误是间歇性的(也许它抓住了','而不是值) 2)为什么我在图表绘制时获得稳定值10
代码如下:
import time
import serial
import matplotlib.pyplot as plt
import numpy
from drawnow import *
import os,sys
pulseArray = []
plt.ion()
clippingCounter = 0
# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
port='/dev/ttyACM0',
baudrate=115200,
parity=serial.PARITY_ODD,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.SEVENBITS
)
ser.isOpen()
input=1
def plotPulseData():
plt.ylim(0,120)
plt.title('Plots from data of the Pulse Sensor')
plt.grid(True)
plt.ylabel('Pulse')
#plt.subplot(2, 2, 1)
plt.plot(pulseArray, 'ro-', label='BPM', linewidth=2)
plt.legend(loc='upper left')
while True:
#First things first, lets wait for data prior to reading
time.sleep(1)
if (ser.inWaiting()>4):
s = ser.read(4)
#print ser
dataArray = s.split(',')
pulse = float(dataArray[0])
pulseArray.append(pulse)
plt.figure(1)
drawnow(plotPulseData)
plt.pause(.000001)
clippingCounter = clippingCounter + 1
if(clippingCounter>50):
pulseArray.pop(0)
非常感谢任何帮助,谢谢你提前。
答案 0 :(得分:2)
您第一次通过while循环从ser
对象重新分配Serial
到字符串:
ser = ser.read(4)
下次在循环中调用该对象上的inWaiting()
方法时,会出现错误,因为您是在字符串上调用它而不是原始Serial
对象:
ser.inWaiting() > 4
将ser.read(4)
输出的变量名称更改为尚未使用的名称,此错误应消失:
s = ser.read(4)
...
dataArray = s.split(',')