使用PyQtGraph和Pyseri及时绘制

2024-06-08 11:35:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pyqtgraph做一个实时绘图。我正在用Pyserial从和arduino读取数据。在使用pyqtgraph之前,我尝试了matplotlib库,但是它没有给我提供绘图所需的速度。所以,在寻找另一种绘制实时数据的方法时,我遇到了PyQtgraph。我阅读了文档和许多示例,发现了以下两个示例:

pltting with sample interval

plotting using pyqt4

两者都是时间的函数,这是我需要做的。我已经修改了它们,使用Pyserial从Arduino获取数据。问题是它的绘制速度仍然很慢。在

这是我使用的代码(来自第二个链接):

class TimeAxisItem(pg.AxisItem):
  def __init__(self, *args, **kwargs):
    super(TimeAxisItem, self).__init__(*args, **kwargs)

  def tickStrings(self, values, scale, spacing):
    return [QTime().addMSecs(value).toString('mm:ss') for value in values]

class MyApplication(QtGui.QApplication):
  def __init__(self, *args, **kwargs):
    super(MyApplication, self).__init__(*args, **kwargs)
    self.t = QTime()
    self.t.start()

    self.data = deque(maxlen=20)

    self.win = pg.GraphicsWindow(title="Basic plotting examples")
    self.win.resize(1000,600)

    self.plot = self.win.addPlot(title='Timed data', axisItems={'bottom':  TimeAxisItem(orientation='bottom')})
    self.curve = self.plot.plot()

    self.tmr = QTimer()
    self.tmr.timeout.connect(self.update)
    self.tmr.start(100)

    print "Opening port"
    self.raw=serial.Serial("com4",9600)
    print "Port is open"


  def update(self):
    line = self.raw.read()
    ardString = map(ord, line)
    for number in ardString:
        numb = float(number/77.57)
        print numb
        self.data.append({'x': self.t.elapsed(), 'y': numb})
        x = [item['x'] for item in self.data]
        y = [item['y'] for item in self.data]
        self.curve.setData(x=x, y=y)

def main():
  app = MyApplication(sys.argv)
  sys.exit(app.exec_())

if __name__ == '__main__':
  main()

随着时间的推移,我该怎么做才能画得更快?似乎我用这段代码丢失了一些数据。在

真希望你能帮我。在


Tags: inselffordataplotinitdefargs
2条回答

让我觉得有点不对劲的是这里发生的事情的时间,而不是pyqtgraph的细节。您的更新方法是以100ms的间隔为每个QTimer对象轮询串行端口,因此在9600波特时,您的端口可以生成9600bps*.1sec=960字节。但是,你的串行读取()不带参数默认为size=1 per here:http://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.read

因此,在更新调用中,您似乎每100ms只读取1个字节:

line = self.raw.read()

所以我想你应该在read的大小上放一些更合理的东西,1024:

^{pr2}$

中指定的超时序列号。序列号实例化:

self.raw=serial.Serial("com4",9600,timeout=0)

这样,读取不会阻塞,只返回缓冲区中可用的全部数据量。在

在更新函数中,尝试调用

self.curve.clear()

在功能开始的时候。在

相关问题 更多 >