2017-06-22 65 views
1

我目前正在從一個Raspberry Pi 3模型B發送模擬數字轉換器(ADC)2通道數據的項目。我已經寫了一個C代碼,成功地發送數據通過2個UDP端口到計算機,我將這兩個數據在2個獨立的地塊實時繪製。當我嘗試僅顯示1個繪圖時,它會顯示實時值,因爲當我切斷髮生器的信號時,我可以在繪圖中看到它。但是,當我爲2個獨立的地塊嘗試這種方式時,它繪製的是價值觀,但不是實時的。當我切斷髮電機的信號時,我仍然可以看到有跡象表明有信號。起初我認爲這是緩衝區大小問題,所以我將緩衝區大小從1024更改爲32(因爲RPi發送浮點數據值)。此外,我停頓了一段時間。他們都不是我的解決方案。當它有多個圖時,實時圖不是實時的

這是我的Python代碼。

#!/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

編輯:我給了相同的信號通道。所以不要介意圖像中的情節是相同的。

回答

0

我目前管理通過增加從10000μs樹莓裨發送的每個數據之間的時間間隔(爲0.01s)至100000μs(0.1S)來解決該問題