什么是USB高数据传输的最佳方式?

问题描述 投票:0回答:1

我希望使用cypress FX2LP进行30兆字节的USB数据传输,并同时绘制它的图表。我找到了一个涵盖这个30兆字节传输速率的策略:在读取线程中读取1兆字节数据,然后在main_thread中绘制它。但是这个策略需要1兆字节的缓冲区,而我的主板上没有这样的内存。

你有其他解决方案吗?

usb transfer
1个回答
0
投票

你不需要任何线程。

将您的问题分解为更简单的步骤:

  1. 如何衡量和收集我需要的数据?
  2. 如何绘制数据?

对于第1步 - 您不需要实际的转移内容,是吗?你只需要时间;基本上你想传输虚拟数据,把它放到/dev/null但保存一对(nbytes_transferred, timestamp)的列表,这将不会吃那么多的内存。保存,测试/验证,然后继续执行第2步。


编辑

线程UI也不是绝对必要的线程。 您所要做的就是避免阻塞/同步IO;使用异步/非阻塞方法。 在Java中,这意味着像NIO;在Qt - 也许使用QtConcurrentQFuture

实际上每个GUI工具包都基于event loop模型工作:有一个主循环滚动(通常隐藏在application.run()调用中),它一次又一次地向操作系统查询事件(例如用户按键或鼠标使用,计时器启动,[异步]网络或磁盘IO完成或进行等),然后处理或调度这些事件,最终调用你的onButton1Click方法, - 最后睡觉,直到有更多事件要处理。

通常情况下,还有一种方法可以挂钩到onIdle“事件”,这个事件恰好在主循环因为不活动而休眠(为了节省CPU能量和能量)之前发生。在Qt中,这是0超时QTimer,或QAbstractEventDispatcher::aboutToBlock()回调。请参阅this question了解更多您喜欢的内容。

如果所有这些听起来太复杂,或许可以查看this library一些不错的公司在GitHub上开源。 (我刚刚在google上找到它;没有任何关系)。从源头看,它们似乎为Qt-onic提供了一个很好的libusb-1.0 API - 你最有可能用它来进行跨平台的USB访问。哦,他们选择了0超时QTimer方法。

© www.soinside.com 2019 - 2024. All rights reserved.