高波特率FTDI引起的脓毒症

问题描述

我有以下设置:

  • FPGA在UART上以3Mbps的波特率发送数据。传输的数据是1024字节的数据块,以20ms到200ms的可变周期发送。 (因此,即使在最坏的情况下,数据传输率也远未达到3Msps)

  • FTDI 232RG

  • 在我的计算机(Windows)上运行的一段python,基本上是在执行以下操作:使用pyserial,3Msps打开COM端口,轮询in_waiting,直到其达到数据包的大小(1024字节),然后格式化接收到的数据包并在屏幕上打印

该脚本在重复频率较低的情况下效果很好,但是我遇到了重复频率较高(通常为20ms)的问题。当周期为20ms时,我最终在in_waiting之前的某个地方出现缓冲区溢出。我检查了python循环的时间,大约需要4毫秒。因此,看起来像是上游(在FTDI或Windows中)在某个数据包之后4毫秒内向pyserial缓冲区提供了一个以上数据包的东西。

我尝试更改驱动程序中的FTDI延迟(从认的16ms降低到几毫秒),但这似乎无济于事。

我目前对正在发生的事情一无所知。您对如何更好地了解正在发生的事情有什么建议吗?

感谢您的帮助!

解决方法

您可以在TX和RX之间创建一个“循环”并运行以下代码(经过FT2232H的测试,因此最有可能需要更改标识符字符串):

import time
import serial
import serial.tools.list_ports


print([(x[0],x[2]) for x in serial.tools.list_ports.comports()])
port    = [x[0] for x in serial.tools.list_ports.comports() if "FT4Q1LJFB" in x[2]][0]
ser     = serial.Serial(port,12000000)

while True:
    t0      = time.time()
    counter = 0
    for i in range(1000):
        ser.write([1]*3000)
        recv    = ser.read(ser.inWaiting())
        delta_t = time.time() - t0
        counter += len(recv)
        
    print(counter / delta_t)
    

对我来说,显示以下输出

[('COM7','USB VID:PID=0403:6010 SER=FT4Q1LJFA'),('COM8','USB VID:PID=0403:6010 SER=FT4Q1LJFB')]
0.0
0.0
0.0
0.0
96787.81184093593
1201991.0268273412
1201197.0857713912
1201166.9350959768
1201445.4072856384

您会注意到开头是0.0。这是因为我在启动程序后连接了RX和TX,导致接收字节的增加。这是“默认”模式,表示每个字8位+ 1个起始位+ 1个停止位= 10位,这说明了为什么“每秒”仅传输1.2 MB。