python - 打印不符合数据间隔设置

标签 python while-loop

我正在使用这个答案here我有这段代码,它获取应变信号(2 个 channel ),然后应用校准步骤,然后打印 2 个 channel 和当前时间。但看起来打印与我在代码中使用的频率不匹配。

from time import sleep
from Phidget22.Phidget import *
from Phidget22.Devices.VoltageRatioInput import *
import time
import datetime

TIME_OUT = 5000 #5s beofre it throws a timeout exception 
DATA_INTERVAL = 50 #50ms sample frequency 

A0 = -6.128983223994E-06
B0 = -0.000059639277340

A1 = -6.101017778744E-06
B1 = -0.000286467338645

def onVoltageRatioChange0(self, voltageRatio):
    Masse = (voltageRatio - (B0) ) / (A0)
    self.masse = Masse

def onVoltageRatioChange1(self, voltageRatio):
    Masse = (voltageRatio - (B1) ) / (A1)
    self.masse = Masse

def results():
        voltageRatioInput0 = VoltageRatioInput()
        voltageRatioInput0.masse = 0
        voltageRatioInput0.setChannel(0)
        voltageRatioInput0.setOnVoltageRatioChangeHandler(onVoltageRatioChange0)
        voltageRatioInput0.openWaitForAttachment(TIME_OUT)
        voltageRatioInput0.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
        voltageRatioInput0.setDataInterval(DATA_INTERVAL)

        voltageRatioInput1 = VoltageRatioInput()
        voltageRatioInput1.masse = 0
        voltageRatioInput1.setChannel(1)
        voltageRatioInput1.setOnVoltageRatioChangeHandler(onVoltageRatioChange1)
        voltageRatioInput1.openWaitForAttachment(TIME_OUT)
        voltageRatioInput1.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
        voltageRatioInput1.setDataInterval(DATA_INTERVAL)

        print(str(datetime.datetime.now()) + " / " + str(voltageRatioInput0.masse) + " / " + str(voltageRatioInput1.masse))

        voltageRatioInput0.close()
        voltageRatioInput1.close()

if __name__ == '__main__':
    try:
        while True:
            results()

    except KeyboardInterrupt:
        print("Goodbye")
        pass

因此,通常使用 VoltageRatioInput0.setDataInterval(DATA_INTERVAL) 它应该以 20 Hz 的频率打印该值。但它打印给我这个:

2019-11-22 10:24:59.460503 / -0.03847266852956798 / 0.2918630004986786
2019-11-22 10:25:00.099831 / -0.03695316689942101 / -0.02070779820379342
2019-11-22 10:25:00.772398 / -0.04029613574942367 / 0.28775155534154484
2019-11-22 10:25:01.420283 / -0.043487203384171676 / 0.25676361089420047

很明显,我没有 20 Hz...

最佳答案

您的 result() 函数可能花费了大量时间。我无法在这里重现,但一个简单的

python -m cProfile -s tottime your_program.py

应该可以帮助您了解每个循环迭代的大部分时间都花在哪里。

我认为实例化 VoltageRatioInput()VoltageRatioInput.close() 是一个很好的开始方式。您可以尝试将它们放在循环之外,如下所示:

from Phidget22.Phidget import *
from Phidget22.Devices.VoltageRatioInput import *
import datetime

TIME_OUT = 5000 #5s beofre it throws a timeout exception 
DATA_INTERVAL = 50 #50ms sample frequency 

A0 = -6.128983223994E-06
B0 = -0.000059639277340

A1 = -6.101017778744E-06
B1 = -0.000286467338645

def onVoltageRatioChange0(self, voltageRatio):
    Masse = (voltageRatio - (B0) ) / (A0)
    self.masse = Masse

def onVoltageRatioChange1(self, voltageRatio):
    Masse = (voltageRatio - (B1) ) / (A1)
    self.masse = Masse

def results(voltageRatioInput0, voltageRatioInput1):
        voltageRatioInput0.masse = 0
        voltageRatioInput0.setChannel(0)
        voltageRatioInput0.setOnVoltageRatioChangeHandler(onVoltageRatioChange0)
        voltageRatioInput0.openWaitForAttachment(TIME_OUT)
        voltageRatioInput0.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
        voltageRatioInput0.setDataInterval(DATA_INTERVAL)

        voltageRatioInput1.masse = 0
        voltageRatioInput1.setChannel(1)
        voltageRatioInput1.setOnVoltageRatioChangeHandler(onVoltageRatioChange1)
        voltageRatioInput1.openWaitForAttachment(TIME_OUT)
        voltageRatioInput1.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
        voltageRatioInput1.setDataInterval(DATA_INTERVAL)

        print(str(datetime.datetime.now()) + " / " + str(voltageRatioInput0.masse) + " / " + str(voltageRatioInput1.masse))


if __name__ == '__main__':
    try:
        voltageRatioInput0 = VoltageRatioInput()
        voltageRatioInput1 = VoltageRatioInput()

        while True:
            results(voltageRatioInput0, voltageRatioInput1)

        voltageRatioInput0.close()
        voltageRatioInput1.close()

    except KeyboardInterrupt:
        print("Goodbye")

关于python - 打印不符合数据间隔设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58991319/

相关文章:

python - 具有共享质心的混合密度网络

java - Coin Change - Java 无法通过示例 3

Rcpp - 加速 for 和 while 循环内的随机正常绘制

python - 如何在 Python 中运行脚本时操作图形?

python - Pyplot投影不承认数据: numpy. float64错误

python - 在构建需要编译代码的模块时将自定义 CMake 标志传递给 pip

python - 函数名作为另一个函数的输入?

c - 一个整数不等于另一个整数?

matlab - 更改 .txt 文件中的文本并在 MATLAB 中创建新文件输出

java - 为什么在尝试求 1000 中 3 和 5 的所有倍数之和时这不起作用?