2017-06-15 42 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 

這將讓你與所有的程序的裝置的列表在每100個之後。您可以更改數字以調整您希望採用的平均值的頻率。

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  

只要注意,直到隊列滿了,平均值將不會正確地使用該函數。如果您需要第一個數據的平均值,則需要稍微修改該功能。