我正在用 while 循环读取串行数据。但是,我无法控制采样率。
代码本身似乎需要 0.2 秒才能运行,所以我知道我无法比这更快了。但我希望能够精确控制采样速度。
我觉得我可以使用“睡眠”来做到这一点,但问题是,在不同的点,循环本身可能需要更长的时间来读取(具体取决于通过串行数据传输的内容),因此代码将具有来弥补余额。
例如,假设我想每 1 秒采样一次,而循环的运行时间为 0.2 秒到 0.3 秒。我的代码需要足够智能才能休眠 0.8 秒(如果循环需要 0.2 秒)或 0.7 秒(如果循环需要 0.3 秒)。
import serial
import csv
import time
#open serial stream
while True:
#read and print a line
sample_value=ser.readline()
sample_time=time.time()-zero
sample_line=str(sample_time)+','+str(sample_value)
outfile.write(sample_line)
print 'time: ',sample_time,', value: ',sample_value
只需测量运行代码所花费的循环每次迭代的时间,并且sleep
因此:
import time
while True:
now = time.time() # get the time
do_something() # do your stuff
elapsed = time.time() - now # how long was it running?
time.sleep(1.-elapsed) # sleep accordingly so the full iteration takes 1 second
当然不是 100% 完美(可能有时会偏离一毫秒或另一个毫秒),但我想这已经足够好了。
另一个不错的方法是使用twisted's LoopingCall:
from twisted.internet import task
from twisted.internet import reactor
def do_something():
pass # do your work here
task.LoopingCall(do_something).start(1.0)
reactor.run()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)