2011-03-31 86 views
2

我正在使用Python編寫代碼以通過串行端口與超聲波測距儀進行通信,以執行以下操作:
- 每隔0.1秒發送一條命令給傳感器進行距離測量,並記錄傳感器
- 顯示所有的距離測量從最後5秒使用python和matplotlib同時獲取數據和更新圖表

這裏的陰謀是我的代碼的響應:

import serial 
import numpy as np 
import time 
from matplotlib import pyplot as plt 

tagnr=2#Tag number of the sensor that we're pinging 
samplingRate=.1#Sampling Rate in seconds 
graphbuf=50.#Buffer length in samples of logger graph 

!#Initialize logger graph 
gdists=np.zeros(graphbuf) 
ax1=plt.axes() 

!#Main loop 
nsr=time.time()#Next sample request 
try: 
    while True: 
     statreq(tagnr)#Send status request to sensor over serial port 
     temp,dist=statread(tagnr)#Read reply from sensor over serial port 
     gdists=np.concatenate((gdists[1:],np.array([dist]))) 
     print gdists 
     nsr=nsr+samplingRate 
     while time.time()<nsr: 
      pass 

finally: 
    ser.close()#Close serial port 
    print 'Serial port closed.' 

現在,我的代碼可以獲取最後50個mea的數組但我不知道如何在圖表中同時顯示這些內容(我通常使用Matplotlib繪製圖表)。我應該使用線程嗎?或者使用pyGTK或pyQt4使用動畫圖形?我也在考慮使用pygame?我的計時機制並不是非常優化,但我認爲它非常準確。

回答

1

matplotlib有動畫的圖表,允許數據在圖表顯示時更新:take a look at this page

您的代碼可能是這樣的:

import serial 
import numpy as np 
import time 
from matplotlib import pyplot as plt 

plt.ion() # set plot to animated 

tagnr=2#Tag number of the sensor that we're pinging 
samplingRate=.1#Sampling Rate in seconds 
graphbuf=50.#Buffer length in samples of logger graph 

!#Initialize logger graph 
gdists=np.zeros(graphbuf) 
ax1=plt.axes() 

# make plot 
line, = plt.plot(gdists) 

!#Main loop 
nsr=time.time()#Next sample request 
try: 
    while True: 
     statreq(tagnr)#Send status request to sensor over serial port 
     temp,dist=statread(tagnr)#Read reply from sensor over serial port 
     gdists=np.concatenate((gdists[1:],np.array([dist]))) 
     print gdists 

     line.set_ydata(gdists) # update the data 
     plt.draw() # update the plot 

     nsr=nsr+samplingRate 
     while time.time()<nsr: 
      pass 

finally: 
    ser.close()#Close serial port 
    print 'Serial port closed.' 

只是一些建議(可能是壞的):我個人使用time.sleep在釋放一些處理器不失精確度的方法。我也會在你的try/except塊中加入一些錯誤類型。我認爲np.rollconcatenate更好/更快。

+0

感謝您的評論,但我仍然無法得到更新的陰謀。與此同時,我找到了一個完整的python代碼來記錄和顯示Eli Bendersky的串行數據[link](http://eli.thegreenplace.net/2009/08/07/a-live-data-monitor-with- python-pyqt-and-pyserial /),它幾乎完全符合我的要求。 – 2011-04-01 17:44:57