Python 属性错误:';str';对象没有属性';等待';

Python 属性错误:';str';对象没有属性';等待';,python,matplotlib,serial-port,pyqt5,Python,Matplotlib,Serial Port,Pyqt5,在社区的帮助下,我能够为matplotlib安装所有新的后端,并将代码从Arduino序列运行到python窗口的输出 然后,我可以制作一个漂亮的图形并显示出来,但当我出现以下错误时崩溃: AttributeError:“str”对象没有属性“inWaiting” 这一点在@elethan的帮助下得到了纠正 但是,我现在有一个错误: pulse = float(dataArray[0]) ValueError: could not convert string to float: 此错误并

在社区的帮助下,我能够为matplotlib安装所有新的后端,并将代码从Arduino序列运行到python窗口的输出

然后,我可以制作一个漂亮的图形并显示出来,但当我出现以下错误时崩溃:

AttributeError:“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)

非常感谢您的帮助,提前谢谢您

第一次通过while循环将
ser
对象从
Serial
对象重新分配到字符串:

ser = ser.read(4)
下一次通过循环调用该对象上的
inWaiting()
方法时,会出现一个错误,因为您是在字符串上调用它,而不是在原始的
Serial
对象上:

ser.inWaiting() > 4 
ser.read(4)
输出的变量名更改为尚未使用的名称,此错误应消失:

s = ser.read(4)
...
dataArray = s.split(',')

谢谢你的帮助。这确实有效,但只是间歇性的。每隔几次,我运行脚本,或者得到一些打印数据,然后是一个错误;或者没有执行,只是一个错误;或者不绘制任何内容(如果我更改图形范围,即plt.ylim(0120))并且图形运行(和更新)良好。也许“分裂”出了什么问题?我将更新我的帖子以反映。我将针对新问题发布一篇新帖子。谢谢大家的帮助。我不确定您处理的数据的性质。发生的情况是,有时
dataArray
将是一个列表,其中第一个元素(
dataArray[0]
是一个无法转换为浮点的字符串(也就是说,不是像
'1'
'1.0'
那样的东西。有一些方法可以处理这个问题,但我不确定你想做什么。如果你在分配
脉冲之前添加
打印s
,你会看到什么样的字符串?我正在根据BPM接收心率数据。arduino正在根据它输出正确的BPMs串行监视器。当添加“print s”行时,我看到了一组我预期的值,即146、146、152、152、152、152、156…我必须再次运行此操作以查看错误的原因。这一次,我遇到了一个不同的错误。它是“bpArray.pop(0)NameError:名称“bpArray”未定义