gpt4 book ai didi

linux - 如何(几乎)防止 FT232R(uart)接收数据丢失?

转载 作者:太空狗 更新时间:2023-10-29 12:13:22 25 4
gpt4 key购买 nike

我需要将数据从裸机微 Controller 系统传输到 2MBaud 的 Linux PC。linux PC 当前运行的是 32 位 Kubuntu14.04。

为了存档,我曾尝试使用基于 FT232R 的 USB-UART 适配器,但有时我发现数据丢失。

只要 linux PC 主要处于空闲状态,它似乎大部分时间都在工作;但是,我发现很少有数据丢失。

但是当我强制 cpu 加载时(例如重建我的项目),数据丢失会显着增加。

经过一些研究,我阅读了 here , FT232R 包含一个容量仅为 384Byte 的接收缓冲区。这意味着,至少每 1.9 毫秒后必须读出 FT232R(USB 轮询)。好吧,FTDI推荐使用流控,但是由于使用的是单片机系统,我是固定不能使用任何流控的。

我可以接受这样一个事实,即没有绝对保证没有数据丢失。但是观察到的数据丢失量对于我的需求来说太过沉重了。

所以我试图找到一种方法来增加我的 linux 上“FT232 驱动程序”的优先级,但找不到如何做到这一点。里面没有描述 AN220 FTDI Drivers Installation Guide for Linux和文件 AN107 FTDI Advanced Driver Options有一个关于“更改驱动程序优先级”的说明,但仅适用于 Windows。

那么,有人知道如何在 linux 中增加 FT232R 驱动程序的优先级吗?

还有其他办法解决这个问题吗?

顺便说一句:当我阅读 FT232H datasheet 时,这似乎带有 1KiB RX 缓冲区。我现在就订购一个并检查它的行为。编辑:没有显着改善。

最佳答案

如果您想要可靠的数据传输,绝对没有办法在没有硬件流控制的情况下正确使用任何 USB 转串口桥接器,并且没有将微 Controller 中至少所有剩余的 RAM 用作串行缓冲区(或至少在您可以存储 ~1s 的数据之前)。

我一直在使用 FTDI 设备,因为 FT232AM 是一个热门的新事物,下面是我如何实现它们:

  1. (至少)四根线在桥和 MCU 之间:RXD、TXD、RTS#、CTS#。

  2. 在 PC 端启用流量控制。

  3. 在事物的 MCU 端启用流控制。

  4. MCU 代码只有在可以将完整的回复数据包装入缓冲区时才会发送通信。否则,它会让 PC 端超时并重试请求。对于流回数据的请求,如果在帧就绪时它不能容纳在传输缓冲区中,则整个帧将被丢弃。

  5. 如果您希望 PC 能够可靠地收到新数据的通知,比如每次完整 样本/帧,您必须使用事件字符将 FTDI 缓冲区刷新到历史记录,并且编码你的数据。 HDLC 非常适合用于此目的,并且记录在免费标准中(RFC 和 ITU X 和 Q 系列 - 全部免费!)。

  6. VCP 驱动程序或 D2XX 端口启动设置为根据应用程序的需要设置传输大小和延迟。

  7. 通信协议(protocol)是成帧的,带有 CRC。我通常使用 X.25/Q.921/HDLC 的缩减版本,仅限于简单的“哑”命令和响应设备的 SNRM(E) 模式,以及流数据设备的 SABM(E)。

FTDI 缓冲区的大小并不重要,您的 MCU 应该至少有一个数量级的存储空间来缓冲东西。

如果您正在运行硬实时代码,例如信号处理,请确保您考虑了“背靠背”运行的大量传输中断的开销。一旦 FTDI 设备在 USB 传输后清除其缓冲区,并表明它已准备好从您的 MCU 接收更多数据,您的代码可能会立即传输一个完整的 FTDI 缓冲区的数据。

如果您的实时代码中的周期即将耗尽,您可以使用定时器作为传输中断源,而不是 UART 中断。然后,您可以将定时器速率设置为远低于 UART 速度。这使您可以在不降低波特率的情况下放慢传输速度。如果您在设置/预操作模式下运行或实时任务负载较低,则可以在不更改波特率的情况下轻松提高传输速率。您可以使用类似的技巧来调整接收速度,方法是在定时器控制下翻转 MCU 上的 RTS# 输出。当然,如果您使用 DMA 或速度足够快的 MCU,这不是问题。

如果您没有定时器,请注意许多其他外围设备也可以重新用作定时器中断源。

无论 USB 主机是什么,这条建议都适用。

边栏:诚然,据我所知,Linux USB 串行驱动程序“架构”处于假死状态,因此要获得合理的结果可能需要大量工作。恐怕这不是简单的内核线程优先级更改的问题。部分原因是许多 Linux 工作的资金都集中在服务器/企业应用程序上,USB 性能充其量只是次要的问题。它适用于 USB 存储,但 USB 串行是一团糟,没有人真正关心到需要大修和大修的程度。看看那个部门复制面食的数量...

关于linux - 如何(几乎)防止 FT232R(uart)接收数据丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33601746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com