我编写了一个系统,用于在arduino nano和我的python脚本之间交换crc-checked结构数据。这工作得很好,但是当我让系统运行时,我的python监视器上会出现意外的输出(使用pycharm)
print“Took”,(time.time() - timeout),“s”有时打印出0.0秒。 通常打印Took 0.0160000324249 s。 使用win7-64bit专业版。
从时间doc:返回自纪元以来的秒数作为浮点数。请注意,即使时间总是作为浮点数返回,但并非所有系统都提供的精度高于1秒。
我正在寻找像millis()这样的东西,足够精确到我的情况
Code Python:
import serial
import time
import binascii
import struct
from ctypes import *
arduino = serial.Serial()
def receive_struct2():
start = 0x85
detected_start = False
arduino.baudrate = 57600
arduino.timeout = 0
arduino.port = 'COM8'
try:
arduino.open()
except serial.SerialException, e:
print e
while True:
if(arduino.inWaiting() >= 1 and detected_start == False):
data = ord(arduino.read())
if data == start:
print "Detected begin"
detected_start = True
else: print chr(data),
if arduino.inWaiting() >= 1 and detected_start == True:
message_length = ord(arduino.read())
#print "Got message length ", message_length
timeout = time.time()
while time.time() - timeout <= 0.3 and arduino.inWaiting() < message_length-1:pass
print "Took ", (time.time() - timeout), " s"
....
答案 0 :(得分:1)
摘要:使用timeit.default_timer()
代替time.time()
来衡量持续时间。
time.time()
的16ms错误在Windows上并不令人惊讶。
目前,Python使用GetSystemTimeAsFileTime()
在Windows上实现time.time()
,其分辨率(精度)为0.1ms(而不是ftime()
的1ms),准确性为在0.5毫秒到15毫秒之间(您可以使用NtSetTimerResolution()
在系统范围内更改它)。请参阅Python错误:Use GetSystemTimeAsFileTime()
to get a resolution of 100 ns on Windows和另一个SO问题:How does python's time.time() method work?
在Windows上测量短时间间隔的更好选择是使用在Windows上使用time.clock()
实现的QueryPerformanceCounter()
。为了便于移植,您可以使用在Windows上分配给time.clock()
的{{3}},在其他系统上分配time.time()
,从Python3.3开始为timeit.default_timer
。见time.perf_counter()