python - 如何记录系统输出1的时间?

标签 python

此代码注册来自串行 USB 端口距离跟踪器的传入数据,并将数据流转换为 10(如果它们超过特定阈值)并添加 Unix 时间戳

代码:

import serial
import datetime
import time

distance = 5

# Open serial usb port
ser = serial.Serial('/dev/tty.usbserial', 115200, timeout=0.05)

# converts data to 1/0 
def convertData(data):
    data = data.decode("utf-8")
    data = data.replace('$BM,','') 

    try:
        data = float(data)
        if data <= distance:
        data = 1
        else:
            data = 0
    except ValueError:
        pass
    return data


while True:
    data = ser.read(9999999)
    measureunix = float(time.time())
    specData = convertData(data)
    print ('Distance:', specData,'Timestamp(Unix):', measureunix)   

终端输出:

Distance: 1 Timestamp(Unix): 1495381131.521877
Distance: 1 Timestamp(Unix): 1495381131.572295
Distance: 1 Timestamp(Unix): 1495381131.626737
Distance: 1 Timestamp(Unix): 1495381131.677538
Distance: 1 Timestamp(Unix): 1495381131.73111
Distance: 1 Timestamp(Unix): 1495381131.786401
Distance: 1 Timestamp(Unix): 1495381131.839391
Distance: 0 Timestamp(Unix): 1495381131.889872
Distance: 0 Timestamp(Unix): 1495381131.940595
Distance: 0 Timestamp(Unix): 1495381131.991894
Distance: 0 Timestamp(Unix): 1495381132.043311
Distance: 0 Timestamp(Unix): 1495381132.097168
Distance: 0 Timestamp(Unix): 1495381132.149091
Distance: 0 Timestamp(Unix): 1495381132.200407
Distance: 0 Timestamp(Unix): 1495381132.25372
Distance: 0 Timestamp(Unix): 1495381132.306592

问题:

至于下一步 - 我不知道如何做到这一点,但我想设置一个计数器,当输出为(1)时开始计数,继续计数,直到有两个连续的(0),然后停止计数并打印出计数 (time_of_last(1)-time_of_first(1)) 所花费的时间除以 (1) 的数量,并等待下一个 (1) 并再次启动。

背景:

我正在尝试构建一个系统,使用距离跟踪激光来测量旋转盘的速度(盘上有固定直径的孔)。因此,激光会记录旋转,并且可以了解旋转圆盘的角速度和角度

也许有更好的方法来做到这一点,我不确定。

最佳答案

当然,我无法使用真实数据对此进行测试,但以下方法似乎适用于模拟输入。基本上,您正在做的是解析 0 和 1 的数据流,以及 Finite-State-Machine似乎是一个好方法。一个人的逻辑可以完全封装在一个类中:

class FSM(object):
    def __init__(self):
        self.state = self.state0

    def transition(self, value):
        self.state(value)

    def state0(self, value):
        if value == 1:
            self.start = time.time()
            self.count = 1
            self.state = self.state1

    def state1(self, value):
        if value == 0:  # first 0?
            self.state = self.state2
        if value == 1:
            self.count += 1

    def state2(self, value):
        if value == 0:  # second 0 in a row?
            elapsed = time.time() - self.start
            try:
                rate = self.count / elapsed
            except ZeroDivisionError:
                rate = float('NaN')
            print('rate {}'.format(rate))
            self.state = self.state0
        if value == 1:
            self.count += 1
            self.state = self.state1

使用它很简单 - 只需使用每个数据值调用其 transition() 方法即可:

fsm = FSM()
while True:
    data = ser.read(9999999)
    measureunix = float(time.time())
    specData = convertData(data)
    print('Distance:', specData, 'Timestamp(Unix):', measureunix)
    fsm.transition(specData)

关于python - 如何记录系统输出1的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099063/

相关文章:

python - 字典应该按公司顺序存储 key 吗?

python - python 细化、平均、舍入数据

python - 优化在同一字符串上多次调用 'in' 的运行时间

python - django项目目录结构和python路径

python - 可视化代码覆盖率结果的好方法

python - 为带有祖先的 key 创建一个好看的 url

python - 使用 Django ORM 指定带有 UNION 的 SELECT 中的列顺序

python - 在 pip 中为 flask 应用程序构建 docker 图像失败

python - 计算条件行数的优化方法

python - 使用装饰器将字典插入 python 类