2016-04-29 4 views
1

Ich versuche, eine Echtzeit-Plot mit pyqtgraph zu tun. Ich lese die Daten von und Arduino mit Pyserial. Ich habe die matplotlib-Bibliothek ausprobiert, bevor ich pyqtgraph benutzte, aber es gab mir nicht die Geschwindigkeit, die ich plotten musste. Also, auf der Suche nach anderen Möglichkeiten, Live-Daten zu zeichnen, habe ich PyQtgraph getroffen. Ich lese die Dokumentation und viele Beispiele, und ich habe diese beiden Beispiele gefunden:Plotten in der Zeit mit PyQtGraph und Pyserial

pltting with sample interval

plotting using pyqt4

Beide sind gezeichnet als Funktion der Zeit, das ist, was ich tun muss. Ich habe jeden von ihnen geändert, um die Daten vom Arduino mit Pyserial zu erhalten. Das Prolem ist, dass es immer noch sehr langsam zeichnet.

Dies ist der Code (aus dem zweiten Link) Ich bin mit:

class TimeAxisItem(pg.AxisItem): 
    def __init__(self, *args, **kwargs): 
    super(TimeAxisItem, self).__init__(*args, **kwargs) 

    def tickStrings(self, values, scale, spacing): 
    return [QTime().addMSecs(value).toString('mm:ss') for value in values] 

class MyApplication(QtGui.QApplication): 
    def __init__(self, *args, **kwargs): 
    super(MyApplication, self).__init__(*args, **kwargs) 
    self.t = QTime() 
    self.t.start() 

    self.data = deque(maxlen=20) 

    self.win = pg.GraphicsWindow(title="Basic plotting examples") 
    self.win.resize(1000,600) 

    self.plot = self.win.addPlot(title='Timed data', axisItems={'bottom': TimeAxisItem(orientation='bottom')}) 
    self.curve = self.plot.plot() 

    self.tmr = QTimer() 
    self.tmr.timeout.connect(self.update) 
    self.tmr.start(100) 

    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) 
     print numb 
     self.data.append({'x': self.t.elapsed(), '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) 

def main(): 
    app = MyApplication(sys.argv) 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

Was kann ich schneller im Laufe der Zeit zeichnen tue Es scheint, dass ich mit diesem Code einige Daten bin zu verlieren?.

Wirklich hoffe, dass Sie mir helfen können.

+1

Mit dem [Python Profiler] (https://docs.python.org/2/library/profile.html) können Sie untersuchen, welche Funktionen die meiste Ausführungszeit benötigen. Ich empfehle Ihnen wirklich, es auszuprobieren. – titusjan

Antwort

0

In Ihrem Update-Funktion, versuchen

self.curve.clear() 

ganz am Anfang der Funktion aufrufen.

+0

Thnak Sie für Ihre Antwort. Meinst du nach der for-Schleife? oder davor? –

+0

Versuchen Sie es als erste Zeile in Ihrer for-Schleife. Wenn ich jedoch auf dein Skript schaue, bin ich mir nicht sicher, ob das der Aufhänger ist. Ich habe in dieser Sekunde keinen Arduino vor mir, sonst würde ich versuchen, Fehler zu beheben. Sind Sie sicher, dass Ihre Update-Funktion vor dem Timeout abgeschlossen ist und versucht, die Update-Funktion neu zu starten? – user2070870

0

Was mich etwas abstolpert, ist das Timing dessen, was hier vor sich geht, und nicht die Einzelheiten des Pygitgraphs. Ihre Aktualisierungsmethode fragt den seriellen Port in 100ms-Intervallen nach Ihrem QTimer-Objekt ab. Bei 9600 Baud könnte Ihr Port also 9600 bps * .1sec = 960 Bytes generieren. Jedoch Ihre serial.Serial.read() ohne Argument standardmäßig size = 1 pro hier: http://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.read

So scheint es, als ob Sie nur 1 Byte alle 100ms in Ihrem Update Aufruf des Lesens:

line = self.raw.read() 

Also meine Vermutung ist, dass Sie etwas mehr sinnvoll in der Lesegröße, 1024 setzen sollen:

line = self.raw.read(1024) 

mit einem Timeout angegeben in der serial.Serial Instanziierung:

self.raw=serial.Serial("com4",9600,timeout=0) 

Auf diese Weise blockiert der Lesevorgang nicht und gibt nur die gesamte im Puffer verfügbare Datenmenge zurück.

Verwandte Themen