我需要通过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使用datetime,我可以让2毫秒来执行一个命令&随着时间的推移,我得到了相同命令的200毫秒。
我怀疑我打错了timeit(),有人能给我指明正确的方向吗?
发布于 2015-08-27 19:00:46
我假设200 s更接近事实,考虑到您的comport将具有类似于115200波特的内容;假设消息有8个字节长,仅在串行线路上发送一条消息就需要大约9/115200 s ~= 10/100000 = 1/10,000 =100 s。比这更快是不可能的。
Python绝对不是在这些尺度上进行时间表征的首选语言。您将需要一个逻辑分析器,或者非常接近串行控制器的(我希望它直接连接到您的PC的IO控制器,而不是一些USB设备,因为这至少会带来同样大小的延迟)。如果您说的是微秒,测量中的限制因素通常是计算机对中断作出反应所需的随机时间,运行中断服务例程的操作系统,继续用户进程的调度程序,然后以其水平和间接级别启动python。你基本上是通过拿着一根香蕉来测量一粒沙子的大小。
https://stackoverflow.com/questions/32257262
复制相似问题