- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要将数据从裸机微 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 是一个热门的新事物,下面是我如何实现它们:
(至少)四根线在桥和 MCU 之间:RXD、TXD、RTS#、CTS#。
在 PC 端启用流量控制。
在事物的 MCU 端启用流控制。
MCU 代码只有在可以将完整的回复数据包装入缓冲区时才会发送通信。否则,它会让 PC 端超时并重试请求。对于流回数据的请求,如果在帧就绪时它不能容纳在传输缓冲区中,则整个帧将被丢弃。
如果您希望 PC 能够可靠地收到新数据的通知,比如每次完整 样本/帧,您必须使用事件字符将 FTDI 缓冲区刷新到历史记录,并且编码你的数据。 HDLC 非常适合用于此目的,并且记录在免费标准中(RFC 和 ITU X 和 Q 系列 - 全部免费!)。
VCP 驱动程序或 D2XX 端口启动设置为根据应用程序的需要设置传输大小和延迟。
通信协议(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/
我正在使用mmap创建共享内存段,并且想知道是否可以在不触发任何内存使用的情况下预先创建要在/dev/shm中使用的所有段。我怀疑这可能是因为我知道大多数文件系统都具有全零页面的概念,并且在进行任何写
ft.search“或”查询TAG字段的搜索词数是否有限制? 示例:ft.search my_index“@my_field:{item1 | item2 ...}” 我可以走多远?我可以为查询提供数
他们在下面的文档说它是O(n),没有指定n。如果索引中没有文档,则搜索可能会非常慢。这没有任何意义,还是吗? https://oss.redislabs.com/redisearch/Commands
我正在 $message id 字段上使用 FT 搜索来检索父文档。我的数据库已建立 FT 索引。我需要父文档来接受 session 邀请。我如何能够在收到 session 邀请 2 小时后检索文档。
我想使用基于node js的myslq与当前Android服务器进行通信。尝试解析 json 以将数据发送到服务器时出现问题。 app.get('/main', function(req, res)
我在使用第二个函数时遇到了一些麻烦,但由于它引用了第一个函数,所以我将两者都包括在内。我一直在玩弄可选项(?和!)并无济于事,得到'无法分配类型'AnyObject?!'的不可变值除其他外。谢谢。 f
所以我正在制作一个只使用 java IDE 中的控制台的游戏,但我在使用延迟时遇到了问题。我的目标是创建一种方法,当通过参数传递文本时,它会逐个字母地打印它,延迟 50。(有点像 Pokemon 系列
我只是尝试编译一个makefile,但它不起作用,我的 Makefile 是这样的, 这对我来说非常重要,我将上传并发布所有文件夹的链接,如果有人能帮助我,他可能会去天堂:D这是我所有文件夹的链接,任
我在这里尝试了不同的解决方案,例如重新启动 adb..etc,但没有一个对我有用。我收到此错误: Error:Failed to complete Gradle execution.
我正在尝试找出如何在这个 Finally Tagless EDSL 中表达 Y-Combitor: class Symantics exp where lam :: (exp a -> exp
我的转换数学是正确的(在这里查找),但是从显示高度(以厘米为单位)的元素中获取值,然后将其解析为英尺/英寸并将其显示在(单击时)右手跨度上不起作用,我收到引用错误(转换器未定义)。 我不明白为什么它是
我正在尝试将数字格式化为匈牙利货币格式。但出于某种原因,它显示 3 位货币代码而不是像这样的福林符号 (ft) 10,00 HUF 它似乎适用于其他国家/货币,例如显示英镑 £10.00 这是我的代码
我对在Python中进行傅立叶变换时有用的技巧和香蕉皮感兴趣。 请提供介绍性代码示例以进入该主题,并就高级主题提供更多建议,例如:频率滤波器、连续 FT、高维 FT。 最佳答案 Python 中的二维
我正在尝试编写一个脚本,它将登录到我的 FT.com 帐户并为我提取一些数据。 第一个障碍显然是登录。为此我正在使用 Pythons Requests 库。 这是我的代码: #!/usr/bin/en
在 Facebook 页面上,许多 HTML 元素包含一个“data-ft”JSON 对象,其格式如下: data-ft='{ "src":10, "sty":263, "actrs":"117307
据我从维基百科和令人难以置信的 HPE 网站收集到的信息,NonStop 系统架构的名声在于它可以实现单一故障 FT,而无需分配过多的备用容量(即在锁步架构中您通常需要 3 倍的超额配置)。 这似乎是
我已经在 SQL Server 2005 中设置了 FT 搜索,但我似乎找不到将“Lias”关键字与带有“Lia's”的记录相匹配的方法。我基本上想要的是允许人们在没有撇号的情况下进行搜索。 我已经断
我正在使用FreeT从free库中输入来编写这个“运行”底层StateT的函数: runStateFree :: (Functor f, Monad m) => s -> Fr
我读过很多关于Sphinx或Solr或MySQL FT的文章。我有一个包含超过 100 万种产品的表,需要进行全文搜索并在 1 秒内获得结果......。有人有这种快速搜索的经验吗?作为 clint
我想通过调整变量 ft_boolean_syntax 来更改 MariaDB/MySQL 的搜索行为,以便与 Phabricator 一起使用。 按照 Phabricator 的建议 To chang
我是一名优秀的程序员,十分优秀!