2014-07-24 2 views
0
import sys 
import serial 
import numpy as np 
import matplotlib.pyplot as plt 
from collections import deque 

port = "COM11" 
baud = 9600 
timeout=1 

ser = serial.Serial() 
ser.port = port 
ser.baudrate = baud 
ser.timeout = timeout 


a1 = deque([0.0]*100) 
#ax = plt.axes(xlim=(0, 100), ylim=(0, 1000)) 



line, = plt.plot(a1) 
plt.ion() 
plt.ylim([0,1000]) 

try: 
    ser.open() 
except: 
    sys.stderr.write("Error opening serial port %s\n" % (ser.portstr)) 
    sys.exit(1) 

#ser.setRtsCts(0) 

while 1: 
    # Read from serial port, blocking 
    data = ser.read(1) 

    # If there is more than 1 byte, read the rest 
    n = ser.inWaiting() 
    data = data + ser.read(n) 
    #sys.stdout.write(data) 
    print(a1) 

    a1.appendleft((data)) 
    datatoplot = a1.pop() 
    line.set_ydata(a1) 
    plt.draw() 

시리얼 포트 값과 샘플 포인트 사이에 플롯이 나타납니다. 나는 시간 대 연속 플롯 값을 플로팅하고 싶다. 우리가 freqs = scipy.fftpack.fftfreq 사용하여 주파수 값에 샘플 포인트를 변환하는 방법을 같은 시간 값에 샘플 포인트를 변환하는 방법, 무언가가 (n은, D) 감사샘플 포인트 시간 값을 변환하십시오.

답변

0

당신을 플롯하려면 프로그램의 시작부터 시간에 대한 데이터 :

import time 

t0 = time.time() 
tlist = deque([np.nan] * 100) 

while 1: 
    # read the serial data ... 
    # when you have read a sample, capture the time difference 
    # and put it into a queue (similarly to the data values) 
    deltat = time.time() - t0 
    dlist.appendleft((deltat)) 

    # remember to pop the data, as well 
    dlist.pop() 
    a1.pop() 

    # set the x and y data 
    line.set_xdata(tlist) 
    line.set_ydata(a1) 

    # draw it 
    plt.draw() 

이제 X 축에서 프로그램을 시작한 시간을 초 단위로 알 수 있습니다. 당신이 다음 그림과 실제 시간이 datetime.datetime 객체를 사용하려면

는 :

import datetime 

dlist = deque([datetime.datetime.now()] * 100) 

while 1: 
    # capture the serial data ... 

    dilst.appendleft((datetime.datetime.now())) 

    # everything else as above 

이렇게하면 X 축에서 실시간으로 플롯을 제공해야합니다.

+0

위 코드에서 코드를 변경했고 플롯을 얻었습니다 단일 사인파 즉 한 번만 사용할 수 있습니다. 그 물결은 은 9 점에 도달 한 후에 있도록 (내 x 축이 시간 값을 표시해야합니다 plot.I에서 시간 대 사인파를 플롯 할 (내 양단 큐의 길이 (10)를 촬영 한) 앞으로 여행을 유지하고 사라 I 웨이브의 시간주기를 알려줄 수 있습니다. 주파수를 확인하기 위해 fft를하면 안됩니다. 수 있습니다. 이것처럼 끝내야 해. – user3805148

+0

적어도 내 코드 ('line.pop()'에'dlist.pop'가 있어야했던 버그가있었습니다). 빈도 만보고 싶다면 첫 번째 샘플을 항상 0 시간으로 유지하도록 첫 번째 솔루션 (실험 시작부터 초)을 사용하거나 고정 된 시간 척도를 유지하려는 것이 가장 좋습니다. 그리고, 네, 물론 할 수 있습니다. – DrV

0
import sys 
import serial 
import numpy as np 
import matplotlib.pyplot as plt 
import time 
from collections import deque 
from scipy import arange 
port = "COM13" 
baud = 9600 
timeout=1 

ser = serial.Serial() 
ser.port = port 
ser.baudrate = baud 
ser.timeout = timeout 
t0=time.time() 


tlist = deque([np.nan]*10) 
a1 = deque([0.0]*10) 
#ax = plt.axes(xlim=(0, 100), ylim=(0, 1000)) 



line, = plt.plot(a1) 
plt.ion() 
plt.ylim([-100,100]) 
plt.grid(b=True,which= 'major' , color= 'g' , linestyle= '--') 
#plt.grid(b=True,which= 'minor' , color= '-m' , linestyle= '--') 

try: 
    ser.open() 
except: 
    sys.stderr.write("Error opening serial port %s\n" % (ser.portstr)) 
    sys.exit(1) 

#ser.setRtsCts(0) 

while 1: 
    # Read from serial port, blocking 
    data = ser.read(1) 

    # If there is more than 1 byte, read the rest 
    n = ser.inWaiting() 
    data = data + ser.read(n) 
    #sys.stdout.write(data) 
    #print(a1) 
    #data1=int(data)-128 

    deltat = time.time() - t0 


    tlist.appendleft((deltat1)) 
    datatoplot = tlist.pop() 

    a1.appendleft((data)) 
    datatoplot = a1.pop() 
    line.set_xdata(tlist) 
    line.set_ydata(a1) 
    plt.hold(False) 
    plt.draw() 

이것은 내가 사용한 완전한 코드이며, 예전에 그 라인을 이미 변경했습니다. 하지만 내가 앞에서 설명한 것처럼 x 축에서 시간 값을 얻을 수는 없습니다.

관련 문제