2017-06-22 2 views
1

Ich arbeite derzeit an einem Projekt, das ich Daten von Analog-Digital Converter (ADC) senden 2 Kanal von einem Raspberry Pi 3 Modell B. Ich habe habe einen C-Code geschrieben, der erfolgreich Daten über 2 UDP-Ports an den Computer sendet, die ich dann in 2 separaten Plots in Echtzeit aufzeichnen werde. Wenn ich versuche, nur eine Grafik anzuzeigen, zeigt sie mir Echtzeitwerte, denn wenn ich das Signal vom Generator abschneide, kann ich es in der Grafik sehen. Wenn ich dies jedoch für 2 separate Plots versuchte, zeichnete es Werte auf, aber nicht in Echtzeit. Wenn ich das Signal vom Generator abschneide, sehe ich immer noch, dass es ein Signal gibt. Zuerst dachte ich, es wäre ein Problem mit der Puffergröße, also habe ich die Puffergröße von 1024 auf 32 geändert (weil RPi Float-Datenwerte sendet). Außerdem habe ich die Pausendauer versaut. Keine von beiden war die Lösung für mich.Realtime-Plot ist nicht Echtzeit, wenn es mehrere Plots hat

Hier ist mein Python-Code.

#!/usr/bin/env python3 

import time, random 
import math 
from collections import deque 
import socket 
UDP_IP = "192.168.180.25" 
UDP_PORT1 = 5013 
UDP_PORT2 = 5012 

sock1 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
sock1.bind((UDP_IP, UDP_PORT1)) 

sock2 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
sock2.bind((UDP_IP, UDP_PORT2)) 

start = time.time() 


class RealtimePlot: 
    def __init__(self, axes, max_entries=100): 
     self.axis_x = deque(maxlen=max_entries) 
     self.axis_y = deque(maxlen=max_entries) 
     self.axes = axes 
     self.max_entries = max_entries 

     self.lineplot, = axes.plot([], [], "ro-") 
     self.axes.set_autoscaley_on(True) 

    def add(self, x, y): 
     self.axis_x.append(x) 
     self.axis_y.append(y) 
     self.lineplot.set_data(self.axis_x, self.axis_y) 
     self.axes.set_xlim(self.axis_x[0], self.axis_x[-1] + 1e-15) 
     self.axes.relim(); 
     self.axes.autoscale_view() # rescale the y-axis 

    def animate(self, figure, callback, interval=50): 
     import matplotlib.animation as animation 
     def wrapper(frame_index): 
      self.add(*callback(frame_index)) 
      self.axes.relim(); 
      self.axes.autoscale_view() # rescale the y-axis 
      return self.lineplot 

     animation.FuncAnimation(figure, wrapper, interval=interval) 


def main(): 
    from matplotlib import pyplot as plt 

    fig, axes = plt.subplots(2) 
    display1 = RealtimePlot(axes[0]) 
    display2 = RealtimePlot(axes[1]) 
    while True: 
     data1, addr = sock1.recvfrom(32) 
     display1.add(time.time() - start, data1) 
     data2, addr = sock2.recvfrom(32) 
     display2.add(time.time() - start, data2) 
     plt.pause(0.0001) 


if __name__ == "__main__": main() 

Plot image

EDIT: ich das gleiche Signal an beiden Kanäle geben. Es macht nichts, wenn die Plots im Bild gleich sind.

Antwort

0

ich zur Zeit habe es geschafft, das Problem durch Erhöhen Zeitintervall zu lösen von 10000μs (0,01s) zu 100000μs (0.1s) zwischen jeweils von Raspberry Pi gesendeten Daten.

Verwandte Themen