现在在做一个串口波形显示工具,即将串口数据绘制成曲线,动态显示。 整个程序是基于 tkinter 做的界面,用的是 canvas,然后再用 plot 去画曲线。 大概流程如下: 线程 1、读取串口数据,并将数据发送到消息队列中; 线程 2、从消息队列中读取数据,并画图 经过 debug 发现,无论串口读取数据的速率是多快,最后刷图总是很慢。 请各位大牛指点一下,是不是有其他更优的刷图方式,还是说程序上要做啥特殊处理 部分参考代码如下:
def serial_deal_data(self,data):
#print(hex(int(binascii.b2a_hex(data),16)))
data_arr=bytearray(data)
data_np = np.array(data_arr)
data_np =data_np.reshape(int(len(data_arr)/2),2)
data_np = data_np[:,0]+data_np[:,1]*256
#tick=time.clock()
self.serial_queue.put(data_np)
#print("2 耗时%16.6f"%(time.clock()-tick))
#print(data_np)
def serial_show_canvas(self):
self.tDataReceived = threading.Thread(target=self._show_canvas, args=( ))
#threading.Timer(0.0001,self.tDataReceived)
self.tDataReceived.setDaemon(True)
self.tDataReceived.start()
def _show_canvas(self):
while True:
if self.serial_queue.empty() == False:
#tick=time.clock()
gc.disable()
data = self.serial_queue.get()
self.show_canvas(data.tolist())
#print("耗时%16.6f"%(time.clock()-tick))
gc.enable()
def show_canvas(self,data):
self.y=self.y[:]+data
for i in range(len(data)):
self.serial_receive_count+=1
self.x.append(self.serial_receive_count)
if self.serial_receive_count>100:
self.ax1.set_xlim([self.serial_receive_count-100, self.serial_receive_count])
self.ax1.plot(self.x,self.y,'r-',label='line1')
self.canvas.show()
plt.close()
当 show_canvas 函数为空时,数据的速度可以达到微秒级;如果执行 self.canvas.show(),则时间为 20-200 毫秒之间,并且随时间递增; 如果只有前面的坐标轴处理部分,则时间稳定在 10ms 以内 将 self.ax1.plot(self.x,self.y,'r-',label='line1')和 self.canvas.show() 去掉之后,时间也能达到微秒级的
加入 gc 处理之后,时间达到 100ms 以内。但始终不是量级的变化。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.