【问题标题】:AttributeError: 'str' object has no attribute 'inWaiting'AttributeError:“str”对象没有属性“inWaiting”
【发布时间】:2026-01-17 02:05:02
【问题描述】:

在社区的帮助下,我能够为 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)

非常感谢您的帮助,在此先感谢您。

【问题讨论】:

  • 我不确定您正在处理的数据的性质。正在发生的事情是,有时dataArray 将成为一个列表,其中第一个元素(dataArray[0] 是一个无法转换为浮点数的字符串(即,不像'1''1.0'。有方法来处理它,但我不确定你想做什么。如果你在分配pulse之前添加print s,你会看到什么样的字符串?
  • 我正在获取以 BPM 为单位的心率数据。 arduino 根据其串行监视器输出正确的 BPM。添加 'print s' 行时,我看到一堆值,如我所料,即 146、146、152、152、152、152、156 ......我将不得不运行更多次以查看导致错误。这一次,我得到了一个不同的错误。它是'bpArray.pop(0) NameError: name 'bpArray' is not defined'

标签: python matplotlib serial-port pyqt5


【解决方案1】:

您第一次通过 while 循环将 serSerial 对象重新分配给字符串:

ser = ser.read(4)

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

ser.inWaiting() > 4 

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

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

【讨论】:

  • 感谢您的帮助。这确实有效,但只是间歇性的。每隔几次我运行我得到的脚本,一些绘制的数据,然后是一个错误;或者没有执行,只是一个错误;或没有绘制任何内容(如果我更改图形范围,即 plt.ylim(0,120))并且图形运行(和更新)正常。也许“分裂”有问题?我会更新我的帖子以反映。
  • 将在新问题上发表新文章。谢谢大家的帮助。
最近更新 更多