Python. Построение графика по точкам из ком-порта в режиме реального времени

Рейтинг: 2Ответов: 0Опубликовано: 11.01.2015

Задача в следующем: необходимо написать программу которая будет читать значения из ком-порта и строить по ним график в режиме реального времени. Кое-как реализовал, НО получается задержка минимум в 3-4 секунды.

Пришел к выводу, что не успеваю забирать значения из буфера. Можно рисовать график в несколько потоков, но поскольку в питоне я не силен. Обратился к вам.

Пожалуйста, предоставьте примеры многопоточного рисования графика с подробным описанием.

import matplotlib.pyplot as plt
plt.ion()

class SerialRead():
    com = 0

    def __call__(self):
        import serial
        self.com = serial.Serial('/dev/ttyACM0', 1200)

    def readValue(self):
        #import time
        #time.sleep(0.2)
        #self.com.flushInput()
        ERR = False
        try:
            line = self.com.readline()
        except:
            ERR = True
            print("ERR::Ресурс временно недоступен!")
        if ERR != True:
            try:
                value = float(line)
            except:
                print("ERR::Wrong value at serial port!")
                ERR = True
        if ERR != True:
            return value


c = SerialRead()
c()

class DynamicUpdate():
    #Suppose we know the x range

    min_y = 0
    max_y = 5.1

    def on_launch(self):
        import numpy as np
        #Set up plot
        plt.rcParams['toolbar'] = 'None'

        self.figure, self.ax = plt.subplots()
        self.lines, = self.ax.plot([],[], 'r')
        #Autoscale on unknown axis and known lims on the other
        #self.ax.set_autoscaley_on(True)
        #self.ax.set_xlim(self.min_x, self.max_x)
        self.ax.set_autoscaley_on(True)
        self.ax.set_ylim(self.min_y, self.max_y)

        #Other stuff
        self.ax.grid()
    ...

    def on_running(self, xdata, ydata):
        import numpy as np
        #Update data (with the new _and_ the old points)
        self.lines.set_xdata(xdata)
        self.lines.set_ydata(ydata)
        #Need both of these in order to rescale
        self.ax.relim()
        self.ax.autoscale_view()
        #We need to draw *and* flush
        self.figure.canvas.draw()
        self.figure.canvas.flush_events()
        #########################################
        x = max(xdata)
        if x > 10000:
            self.ax.set_xlim(x, x - 10000)
        else:
            self.ax.set_xlim(0, x)
        #########################################

    #Example
    def __call__(self):
        import numpy as np
        import time
        import matplotlib.ticker as ticker
        import random
        self.on_launch()
        xdata = []
        ydata = []
        while True:
            OLD_VALUE = c.readValue()
            xdata.append(int(round(time.time() * 1000)))
            ydata.append(OLD_VALUE)
            self.on_running(xdata, ydata)
            #time.sleep(1)
        return xdata, ydata

d = DynamicUpdate()
d()

Ответы

Ответов пока нет.