0

我在 PC 上的应用程序以 1 KB 的块向嵌入式设备发送文件 (2 MB)。

我使用 FTDI Windows 驱动程序,我使用经典的 FT_Write() API 函数,因为我的代码是跨平台的。

注意:当我使用 1KB 块大小时,会出现以下这些问题。较小的块(我尝试了 64 个字节)工作正常。

问题是该函数每几百个数据包返回“0 字节发送”并卡住。我找到了一个解决方法,通过清除 TX 和 Rx,然后调用 ResetDevice() 恢复芯片。它仍然每几百个数据包发生一次,但至少我可以发送整个文件(2 MB)。

但是当我使用 USB 隔离器(http://www.bb-elec.com/Products/USB-Connectivity/USB-Isolators/Compact-USB-Port-Guardian.aspx)时,解决方法失败了。

我相信我的工作不是一个优雅的解决方案。

注意:我使用大块是因为我在下面的 FTDI 应用说明中找到了建议:

将数据写入 FTDI 设备时,应在应用程序中缓冲尽可能多的数据并在单个写入函数调用中写入设备(对于使用 Win32 API 的 VCP 应用程序的 WriteFile,如果使用 D2XX 经典接口,则为 FT_Write 或FT_WriteFile 如果使用 D2XX FT_W32 接口)。其结果是数据将以每个 USB 数据包 64 字节的形式写入设备。

知道这些问题的正确解决方法是什么吗?它与 FTDI 初始化有关吗?我的驱动程序版本是 2.12.16.0 (3/9/2016)。

4

1 回答 1

2
  1. 在为我的 USB 设备 Nusbio 处理库时,如果传递了太多数据,我还看到 API FT_Write() 无法正常工作的相同问题。我主要在同步 Bitbanging 模式下工作,而不是 UART,但毕竟它是相同的硬件、驱动程序和 API。

  2. 有 USB 2.0 规范或 FTDI FT232RL 规范,然后是电子和比特的现实。至少一开始,预期的传输速度数量从未真正匹配。换句话说,它很复杂(在我引用的博客文章中查看更多内容)。

  3. 在 2015 年,我的印象是 FTDI 芯片 FT232RL 的 384 字节大小运行良好,数字来自芯片数据表(128 字节接收缓冲区和 256 字节发送缓冲区)。使用 500 字节的大小仍然可以工作,但超过 600 字节的东西就行不通了。

    后来我使用了具有更大缓冲区(1k,512字节接收缓冲区和512字节发送缓冲区)的芯片FT231X。并且能够使用 FT_Write() 传输 1k 和 2k 数据缓冲区,因此将我的传输速度提高了一倍以上。但是超过 2k 的东西是行不通的。

  4. 在 2016 年,我阅读了有关 FTDI USB 2.0 全速芯片的所有内容,我得出的结论是 FT_Write 应该支持最高 64K(请参阅以下芯片 FT232RL、FT231X、FT232H、FT260、FT4222 的数据表)。

我还对.NET 比 115200 baud 更快的串行端口通信进行了一些研究。

不知何故,我能够更新我的 C# 库以在 FT_Write() 的 32k 缓冲区中发送数据,并且它正在与 FT232RL 和 FT231X 芯片一起使用,但我无法告诉你发生了什么变化。我可能并没有完全理解 USB 2.0 全速 FTDI 技术的进出。

例如,假设您正在使用 FT232RL,并且当时使用 FT_Write() 传输 384 个字节。知道无论您做什么,USB 2.0 全速至少有 1 毫秒的延迟,从 USB 的角度来看,您正在传输 384*1000/1024,理论上是 375 K 字节/秒(这将是最大值),现在说您的嵌入式设备支持的波特率是多少。使用的波特率是多少?FT232RL 的最大波特率为 900 000 波特,这只会给您 900000/(1+8+1) == 87 K 字节/S。马上你就可以看出会有一些问题,可能是 FTDI 驱动程序是否处理了它。我说不出来。根据嵌入式设备支持的波特率重新计算,每秒发送 1000 个 384 字节缓冲区,然后使用 sleep() 降低 USB 速度以匹配您的波特率。

那就是我要开始的地方。

于 2016-12-14T03:54:04.413 回答