【问题标题】:Problem with High speed data read with Settimer method使用 Settimer 方法读取高速数据的问题
【发布时间】:2011-07-13 16:24:37
【问题描述】:

我在 FIFO 模式下使用带有 ftdi 芯片的硬件和 D2xx 驱动程序来完成我的工作。对于不同的设置,硬件以 19.5KHz 到 312.5KHz 的速率发送数据字节。所以我的应用程序软件(MFC C++)应该以不同的速度读取这些字节。我正在使用值为 10 ms 的 Settimer 和 Ontimer 方法。所以每 10 ms 我正在读取数据字节并在 OnTimer 函数中进行一些处理。我的问题是

1>使用 settimer 方法不同的系统给出不同的结果,即使这两个系统都是 XP SP3。一个系统正在读取所有字节而没有任何丢失,但在另一个系统中数据将丢失。那么这个计时器是依赖于操作系统还是系统硬件?

2> 据我了解,我可以为 settimer 设置的最小值是 10 毫秒,因此我可以每 10 毫秒读取一次数据。如果我不快速读取,驱动程序缓冲区中将会溢出,我无法控制。我可以使用任何计时器方法在微秒或纳秒内更快地阅读还是有其他方法? 请给我一些想法......提前谢谢

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    在单独的线程中继续阻塞Read() 可能会更可靠。

    SetTimer() 仅用于低分辨率工作。它的分辨率实际上可以根据最新版本的 Windows 中的电源设置进行缩减。

    如果您想要高分辨率计时器,Timer QueuesMultimedia Timers(特别是 timeSetEvent())是不错的选择,两者的分辨率都可以低至 1 毫秒。

    【讨论】:

      【解决方案2】:

      SetTimer 的问题是,您将不会早于您设置的时间收到计时器通知,但您不能保证它会在您设置的时间准确。

      首先,您取决于系统的计时器分辨率,通常为 15 毫秒。因此,即使您设置 10 毫秒,它也会在 15 毫秒(或更多)处滴答作响。

      其次,当没有更多消息要处理时,会发送计时器通知。因此,在消息循环中,当队列中没有更多消息时,系统会查看是否设置了任何计时器以及是否已计时。如果有,它会发送一个通知。问题是,如果您的程序忙于做其他事情,它可能会丢失一个或多个“滴答声”并将它们“分组”在一个通知中,这可能发生在例如 75 毫秒。

      底线是 SetTimer 不是满足高分辨率需求的可靠计时器方法。

      因此您可能需要查看其他解决方案,例如单独的线程来进行阅读。

      【讨论】:

      • 这里解释得更好link(见WM_TIMER部分)
      猜你喜欢
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多