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

时间:2015-11-09 02:47:20

标签: linux uart ftdi

我需要将数据从裸机微控制器系统传输到具有2MBaud的linux PC。 linux PC目前运行的是32位Kubuntu14.04。

要归档这个,我尝试使用基于FT232R的USB-UART适配器,但我有时观察到数据丢失。

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

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

经过一些研究后我读到here,FT232R由一个容量仅为384Byte的接收缓冲区组成。这意味着,至少每隔1,9ms就必须读出FT232R(USB轮询)。好吧,FTDI建议使用流量控制,但由于使用过的微控制器系统,我固定不能使用任何流量控制。

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

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

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

有什么其他想法可以解决这个问题吗?

BTW:当我读到FT232H datasheet时,它似乎带有1KiB RX缓冲区。我现在订购一个,看看它的行为。编辑:没有重大改进。

1 个答案:

答案 0 :(得分:2)

如果你想要可靠的数据传输,绝对没有办法在没有硬件流控制的情况下正确使用任何 USB-to-serial网桥,并且没有将至少所有剩余的RAM专用于你的微控制器作为串行缓冲区(或者至少可以存储~1s的数据)。

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

  1. (至少)桥和MCU之间有四条线:RXD,TXD,RTS#,CTS#。

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

  3. 在MCU方面启用了流量控制。

  4. MCU代码仅在可以将完整的回复数据包放入缓冲区时才发送通信。否则,它会让PC端超时并重试请求。对于流回数据的请求,如果在帧准备就绪时它不适合发送缓冲区,则删除整个帧。

  5. 如果您希望可靠地通知PC新数据,例如每个完整样本/帧的数量,则必须使用事件字符将FTDI缓冲区刷新到hist,并且编码您的数据。 HDLC非常适用于此目的,并以免费标准(RFC和ITU X和Q系列 - 全部免费!)进行记录。

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

  7. 通信协议以CRC为框架。我通常使用X.25 / Q.921 / HDLC的缩减版本,限于SNRM(E)模式以简化" dumb"命令和响应设备,以及用于流式传输数据的设备的SABM(E)。

  8. FTDI缓冲区的大小并不重要,您的MCU应至少有一个数量级的存储空间可用于缓冲内容。

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

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

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

    无论什么是USB主机,此建议均适用。

    补充工具栏:不可否认,Linux USB串行驱动程序"架构"据我所知,它处于假死状态,所以得到明智的结果可能需要大量的工作。我担心,这不是简单的内核线程优先级更改的问题。部分原因是许多Linux工作的资金主要集中在服务器/企业应用程序上,并且USB性能充其量只是次要问题。它适用于USB存储,但USB串口是一个混乱,没有人真正关心到大修,并彻底改变它的需要。只要看一下该部门的复制面食数量......