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()
EDIT: ich das gleiche Signal an beiden Kanäle geben. Es macht nichts, wenn die Plots im Bild gleich sind.