使用“ PySerial”在Python 3.7.2中读取串行数据的延迟不一致

时间:2019-01-17 07:20:30

标签: python-3.x pyserial

我正在使用pySerial库将Arduino的基本示例“ AnalogReadSerial”中的串行数据读取到Python 3.7.2中。大约不稳定的延迟。 16毫秒异常峰值。在每次录制中观察到1.5秒。 (Arduino的打印时间约为5毫秒/数据点)

  1. 使用pySerial时此延迟正常吗?还是我的代码有问题?

  2. 如果通常看到pySerial出现延迟,那么您可以建议一个更好的库来读取串行数据吗?

尝试的技巧:

  1. 我尝试在Arduino代码中放置足够的延迟(延迟5毫秒)-类似的延迟结果。
  2. 此线程中的建议-PySerial delay in reading line from Arduino-包含“ in_waiting”
  3. 考虑Arduino的打印时间(大约5毫秒)
    import serial   
    import time 

    serialport = serial.Serial('COM3',9600)     #define my port 

    count =1          

    timedata = []

    while count<=100:                           #run for 100 serial values                

     if serialport.in_waiting > 0:              #buffer             

      count += 1                                
      t1 = int(round(time.time()*1000))         #time before reading   

      reading = serialport.readline().decode()  #read serial data and decode

      t2 = int(round(time.time()*1000))         #time after reading     

      finalt = t2 - t1                          #time taken to read             
      timedata.append(finalt)                   #store all time values in a list       
      print(timedata[-1])                       #print time for reading every new value     

几乎每次都得到相似的结果。 在代码运行过程中,峰值为1.5秒,否则延迟为16ms。

这是图形的图像: Time taken (in milliseconds) to read 100 serial data points by python

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您的USB转串行接口芯片(可能是FTDI设备)可能会遇到此延迟问题。

https://projectgus.com/2011/10/notes-on-ftdi-latency-with-arduino/

  

在Linux和Windows上,默认延迟计时器设置为16ms。例如,假设您以115200bps的速度从Arduino发送3字节MIDI消息。作为串行数据,MIDI消息从Arduino的微控制器传输到FTDI芯片需要0.3毫秒的时间。但是,FTDI在延迟计时器到期之前将消息进一步保留在缓冲区中15.8ms(第一个字节到达后16ms),然后它将USB数据包发送到计算机。

本文继续说明如何调整设置。