【发布时间】:2017-04-07 07:22:24
【问题描述】:
我正在监视一个外部设备,它在不满足条件时输出布尔值 False,在满足条件时输出布尔值 True。 问题是,布尔值在满足条件后不止一次输出。
这是输出的样子:
False
False
False
False
True
True
False
False
False
所以我想做的是监控这个值并执行一个简单的函数,每次布尔值从 False 变为 True 时只执行一次。我见过其他具有简单“on change”功能的语言,所以我知道它是可能的,而且可能比我想象的要容易得多。
目前我有这个。为了说明这一点,变量“ext_data”用作python脚本正在监控的外部数据。
while True:
if ext_data == True:
print("true")
pass
每次布尔值等于 true 时都会打印“true”,而当它自行重置时,布尔值仍设置为 True,所以当我只想要一个时我会得到多个读数。
感谢任何提供帮助的人!
编辑:
使用 Holdenweb 编写的 EdgeDetector 类更新了代码。
ext_data = True/False # This returns True or False depending on the state
# of the variable. It is constantly monitored and
# could change at any moment, which is why I'm
# running the function in a while True loop
def printer():
print(u'something%s' % serialport.cts)
post_to_api('cycle_count')
def myfunction():
return ext_data
test_subject = EdgeDetector(myfunction, printer)
while True:
test_subject.test()
这仍然会偶尔返回重复的帖子。有人提到,EdgeDetector 类需要将这些数据放在一个数组中才能正常工作,您如何建议将这些数据放入一个数组而不创建无限长的数组?
【问题讨论】:
-
据我所知,唯一提到将数据存储在数组(实际上是列表)中的人就是你。当您说它“返回重复的帖子”时,您是如何确定的?他们的问题的事实是,除非有一个错误(总是可能的),否则代码不可能检测到边缘,除非首先有一个从高到低的转换(因为从技术上讲,我真的应该称之为 RisingEdgeDetector,但这是假设了解信号的极性)。由于您正在进行轮询,因此您可能会错过短暂的脉冲。
标签: python boolean monitoring onchange