【发布时间】:2017-05-22 16:03:50
【问题描述】:
我正在使用 Tkinter GUI 从 Arduino 接收数据,需要以每秒 20 个样本接收 8 个不同的值并绘制它们。我在一张图上绘制 4,在另一张图上绘制 4。 Arduino 端的代码工作正常,并且使用以下格式以正确的速率发送。
Serial.println(String(val1) + "," + String(val2) + ...
在 Python 方面,我收到并绘制如下图:
def update_graph(self, i):
self.xdata.append(i)
while (self.arduinoData.inWaiting()==0):
pass
x = self.arduinoData.readline()
split_data = x.split(",")
print split_data[1]
self.ydata1.append(int(split_data[0]))
self.ydata2.append(int(split_data[1]))
self.ydata3.append(int(split_data[2]))
self.ydata4.append(int(split_data[3]))
self.ydata5.append(int(split_data[4]))
self.ydata6.append(int(split_data[5]))
self.ydata7.append(int(split_data[6]))
self.ydata8.append(int(split_data[7]))
self.line1.set_data(self.xdata, self.ydata1)
self.line2.set_data(self.xdata, self.ydata2)
self.line3.set_data(self.xdata, self.ydata3)
self.line4.set_data(self.xdata, self.ydata4)
self.ax1.set_ylim(min(self.ydata1), max(self.ydata4))
self.ax1.set_xlim(min(self.xdata), max(self.xdata))
self.line5.set_data(self.xdata, self.ydata5)
self.line6.set_data(self.xdata, self.ydata6)
self.line7.set_data(self.xdata, self.ydata7)
self.line8.set_data(self.xdata, self.ydata8)
self.ax2.set_ylim(min(self.ydata5), max(self.ydata8))
self.ax2.set_xlim(min(self.xdata), max(self.xdata))
if i >= self.points - 1:
self.running = False
self.ani = None
return self.line1,
return self.line2,
return self.line3,
return self.line4,
return self.line5,
return self.line6,
return self.line7,
return self.line8,
事实证明,这太慢了,无法跟上传入的数据。有没有更快的方式接收和解析数据?
【问题讨论】:
-
我怀疑接收和解析数据是最慢的部分。
-
您可以以打包的二进制格式发送该数据,然后使用
struct模块将其解包。 -
@gre_gor 即使我在没有绘图命令的情况下运行它,它也会显着落后
-
你知道第一个
return之后的任何代码都不会执行吗? -
set_data是做什么的?我的猜测是这是一个昂贵的函数调用,因为实际的拆分只需要几微秒。
标签: python matplotlib arduino pyserial