Tôi biết mình đã muộn để trả lời câu hỏi này, nhưng đối với vấn đề của bạn, bạn có thể xem xét gói "cần điều khiển". Tôi đã thiết kế nó để vẽ một luồng dữ liệu từ cổng nối tiếp, nhưng nó hoạt động cho bất kỳ luồng nào. Nó cũng cho phép ghi nhật ký văn bản tương tác hoặc vẽ biểu đồ hình ảnh (ngoài việc vẽ biểu đồ). Không cần phải thực hiện các vòng lặp của riêng bạn trong một chuỗi riêng biệt, gói sẽ đảm nhiệm việc đó, chỉ cần cung cấp tần suất cập nhật bạn muốn. Thêm vào đó, thiết bị đầu cuối vẫn có sẵn để giám sát các lệnh trong khi vẽ biểu đồ. Xem http://www.github.com/ceyzeriat/joystick/ hoặc https://pypi.python.org/pypi/joystick (sử dụng cần điều khiển pip install để cài đặt)
Chỉ cần thay thế np.random.random () bằng điểm dữ liệu thực của bạn được đọc từ cổng nối tiếp trong mã bên dưới:
import joystick as jk
import numpy as np
import time
class test(jk.Joystick):
# initialize the infinite loop decorator
_infinite_loop = jk.deco_infinite_loop()
def _init(self, *args, **kwargs):
"""
Function called at initialization, see the doc
"""
self._t0 = time.time() # initialize time
self.xdata = np.array([self._t0]) # time x-axis
self.ydata = np.array([0.0]) # fake data y-axis
# create a graph frame
self.mygraph = self.add_frame(jk.Graph(name="test", size=(500, 500), pos=(50, 50), fmt="go-", xnpts=10000, xnptsmax=10000, xylim=(None, None, 0, 1)))
@_infinite_loop(wait_time=0.2)
def _generate_data(self): # function looped every 0.2 second to read or produce data
"""
Loop starting with the simulation start, getting data and
pushing it to the graph every 0.2 seconds
"""
# concatenate data on the time x-axis
self.xdata = jk.core.add_datapoint(self.xdata, time.time(), xnptsmax=self.mygraph.xnptsmax)
# concatenate data on the fake data y-axis
self.ydata = jk.core.add_datapoint(self.ydata, np.random.random(), xnptsmax=self.mygraph.xnptsmax)
self.mygraph.set_xydata(t, self.ydata)
t = test()
t.start()
t.stop()