2017-06-15 13 views
0

私はシリアルポートから大量のデータを連続的に受信しています。たとえば、100個の値を受け取るたびに意味をつけたいのですが、私の質問はそれを行う最も簡単な方法は何ですか?ここで一定量の平均値を連続的に取得する方法は?

が私のコードです:

import serial 

ser = serial.Serial('COM23', 19200) 

while 1 : 

    var = ser.readline() 
    fl = float(var) 
    print(fl) 
    KeyboardInterrupt 

ser.close() 
+0

カウンタを追加して、カウンタ%100 == 0 – karlosss

答えて

0

は、元のコードをオフに行く、それは次のようになります。

import serial 

ser = serial.Serial('COM23', 19200) 
meanList = [] 
counter = 0 
total = 0 

while 1 : 

    var = ser.readline() 
    counter += 1 
    fl = float(var) 
    total += fl 
    print(fl) 

    if (counter >= 100): 
     counter = 0 
     meanList.append(total/100.0) 
     total = 0 

    KeyboardInterrupt 

ser.close() 
return meanList 

これはあなたのプログラム内の手段のすべてのリストを取得しますあなたは平均した回数を調整するために数字の周りを変更することができます。

0

より洗練されたソリューションは、最後のN個のアイテムだけを保持する固定サイズのキューを使用することです。あなたの場合、最後の100項目。

N = 100 
values = collections.deque(maxlen=N) 

あなたは、移動平均を計算する必要がある場合は、あなたのような関数を呼び出す:あなたのコードにこれらのアイデアを差し込む

def mean(items, size=N): 
    return sum(items)/size 

、この方法を行うことができます。

import serial 

ser = serial.Serial('COM23', 19200) 

while 1 : 

    var = ser.readline() 
    values.append(var) 
    # This queue will keep the last 100 items. 
    # ... 
    # ... 
    # when you need to use the mean... 
    print(mean(values)) 
    # ... the rest of your code  

待ち行列がいっぱいになるまで、その関数をそのまま使用して平均値が正しいとは限りません。最初のデータの平均値が必要な場合は、関数をわずかに変更する必要があります。

関連する問題