我需要通过RS232与嵌入式系统进行通信。为此,我想分析向每个命令发送响应所花费的时间。
我已使用两种方法测试了此代码:datetime.now()
和timeit()
方法#1
def resp_time(n,msg):
"""Given number of tries - n and bytearray list"""
msg = bytearray(msg)
cnt = 0
timer = 0
while cnt < n:
time.sleep(INTERVAL)
a = datetime.datetime.now()
ser.flush()
ser.write(msg)
line = []
for count in ser.read():
line.append(count)
if count == '\xFF':
# print line
break
b = datetime.datetime.now()
c = b-a
# print c.total_seconds()*1000
timer = timer + c.total_seconds()*1000
cnt = cnt + 1
return timer/n
ser = serial.Serial(COMPORT,BAUDRATE,serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, timeout=16)
if ser.isOpen():
print "Serial port opened at: Baud:",COMPORT,BAUDRATE
cmd = read_file()
# returns a list of commands [msg1,msg2....]
n = 100
for index in cmd:
timer = resp_time(n,index)
print "Time in msecs over %d runs: %f " % (n,timer)
方法#2
def com_loop(msg):
msg = bytearray(msg)
time.sleep(INTERVAL)
ser.flush()
ser.write(msg)
line = []
for count in ser.read():
line.append(count)
if count == '\xFF':
break
if __name__ == '__main__':
import timeit
ser = serial.Serial(COMPORT,BAUDRATE,serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, timeout=16)
if ser.isOpen():
print "Serial port opened at: Baud:",COMPORT,BAUDRATE
cmd = read_file()
# returns a list of commands [msg1,msg2....]
n = 100
for index in cmd:
t = timeit.timeit("com_loop(index)","from __main__ import com_loop;index=%s;" % index,number = n)
print t/100
使用日期时间我会 2毫秒来执行命令&amp;对于同一命令,我得到 200毫秒。
我怀疑我没有正确地呼叫timeit()
,有人能指出我正确的方向吗?
答案 0 :(得分:0)
我认为200μs更接近事实,考虑到你的comport会有类似115200baud的东西;假设消息长度为8个字节,则仅在串行线路上发送一个消息将花费大约9/115200 s~ = 10/100000 = 1 / 10,000 =100μs。比这更快是不可能的。
Python绝对不是在这些尺度上进行时序表征的首选语言。您需要获得一个逻辑分析仪,或者非常靠近串行控制器(我希望它直接连接到您的PC的IO控制器而不是某些USB设备,因为这会引入延迟数量级,至少)。如果你在谈论微秒,那么测量中的限制因素通常是你的PC对中断作出反应所需的随机时间,运行中断服务程序的操作系统,继续你的用户空间进程的调度程序,然后启动python其水平和间接水平。你基本上是通过在它们旁边放一根香蕉来测量单粒沙粒的大小。