【发布时间】:2020-11-11 16:22:27
【问题描述】:
我有以下设置:
-
FPGA 以 3Mbps 的波特率在 UART 上发送数据。传输的数据是一个 1024 字节的块,以 20 毫秒到 200 毫秒的可变周期发送。 (所以即使在最坏的情况下,数据率也远非 3Msps)
-
FTDI 232RG
-
在我的计算机(Windows)上运行的一段python,基本上是:用pyserial,3Msps打开一个COM端口,轮询in_waiting直到它达到一个数据包的大小(1024字节),格式化接收到的数据包并打印它在屏幕上
该脚本适用于低重复频率,但我面临更高重复次数(通常为 20 毫秒)的问题。当以 20 毫秒为周期时,我最终会在 in_waiting 之前的某个地方出现缓冲区溢出。我检查了我的 python 循环的时间,大约需要 4 毫秒。所以看起来上游(在 FTDI 或 Windows 中)有一些东西在一个数据包之后的 4 毫秒内向 pyserial 缓冲区提供多个数据包。
我尝试更改驱动程序中的 FTDI 延迟(从默认的 16 毫秒降低到几毫秒),但似乎没有帮助。
我目前对正在发生的事情一无所知。您对如何更好地了解正在发生的事情有什么建议吗?
感谢您的帮助!
【问题讨论】:
-
你是如何查看时间的? 4毫秒是平均值/最小值/最大值吗?我们在谈论哪个操作系统?
-
nvm 操作系统问题。是否过度阅读了 Windows 部分。
-
嗨,Christian,我将循环时间计算为进入循环的那一刻(in_waiting 至少是数据包大小)与以下 in_waiting 评估的时间之间的时间差。由于数据包长度恒定,数据包恒定,我的机器负载不重,最大4ms,平均约3.8ms,最小约3.8ms。
-
啊等等。您如何定义“缓冲区溢出”。数据会丢失吗?还是只是“一次太多数据”?因为这是预期的,因为 FTDI 集群接收数据,直到接收到足够的 USB 帧或直到触发超时。它类似于 TCP 的 Nagle 算法。
-
一些数据丢失了,因为我传输的数据是一个 16 位数字的列表,我看到在某个时刻,LSB 和 MSB 被“交换”,表明丢失了奇数个字节(偶数字节的丢失将丢失整个 16 位,我可能无法理解)。我知道我期望的值(在给定范围内),所以当我看到“字节序变化”时,我会看到数据丢失,即使发生的是字节序变化,而是丢失了一大块数据。你明白我的意思吗?