如何连续获得一定数量的价值的平均值?

时间:2017-06-15 20:18:34

标签: python serial-port mean pyserial

我从串口连续收到大量数据,我想在每次收到例如100个值时做出一个意思,我的问题是最简单的方法是什么?

这是我的代码:

import serial

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

while 1 :

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

ser.close()

2 个答案:

答案 0 :(得分: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个程序后程序中的所有方法。您可以更改数字以调整您想要均值的频率。

答案 1 :(得分: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    

请注意,在队列已满之前,平均值将无法正常使用该功能。如果您需要第一个数据的平均值,则需要稍微修改该函数。