我使用Pyserial和PyQtgraph来绘制实时数据。我正在读取数据的设备(arduino)和我的电脑之间的连接正常,我的意思是我可以读取数据。问题是当我断开设备时,数据仍在绘图中绘制。如果我让它继续读下去,过了一段时间,情节就会崩溃,我必须重新开始。在
我在看一些帖子,我发现:
所以,我认为问题在于,在我的代码中,数据被附加到一个列表中,然后被打印出来,这使得它变得很慢,也许这就是它崩溃的原因。在
这是我的代码:class MyApplication(QtGui.QApplication):
def __init__(self, *args, **kwargs):
super(MyApplication, self).__init__(*args, **kwargs)
self.t = QTime()
self.t.start()
self.data = deque()
self.cnt = 0
self.win = pg.GraphicsWindow()
self.plot = self.win.addPlot(title='Timed data')
self.curve = self.plot.plot()
self.tmr = QTimer()
self.tmr.timeout.connect(self.update)
self.tmr.start(100)
self.cnt = 0
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)
self.cnt += 1
x = self.cnt/20
self.data.append({'x': x , '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)
我如何修改我的代码以使用上述文章中所写的代码?或者,我如何绘制即将到来的数据而不将其附加到列表中?在
对不起,我是新来的PyQtGraph,我现在很困惑。希望你能帮助我。在
----------编辑---------
我尝试过一种更简单的代码:
^{pr2}$
因此,当它在命令提示符中显示数据后,我断开设备的连接,我可以看到数据仍在显示几秒钟。然后,“没有数据”文本出现。那么,有什么问题呢?我知道,这是缓冲数据,但在我看来,这和其他代码发生的情况是一样的。在
----------编辑2---------
我终于完成了我所需要的。谢谢你的帮助和耐心。在
这是update方法的代码:def update(self):
line = self.raw.read([1])
ardString = map(ord, line)
for number in ardString:
numb = float(number/77.57)
self.data.append(numb)
self.yData.append(numb)
if len (self.yData)>300 :
self.yData = []
self.raw.flush()
self.curve.setData(self.yData)
我现在要做的是将数据转移到两个不同的列表:self.yData和{}。
在self.yData中,我最多只能追加300个数据项(这是随机的,我可以选择500个),然后我刷新所有数据并“清除”列表以重新开始。在
有了这个,我可以立即看到实时数据,并将它们保存在另一个安全的地方。在