使用Settimer方法读取高速数据的问题

时间:2011-07-13 07:40:12

标签: c++ mfc

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

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

2 - ;根据我的理解,我可以为settimer设置的最小值是10 ms所以每10 ms我可以读取数据。如果我没有快速读取,驱动程序缓冲区中会出现溢出,我无法控制。所以我能在微秒内读得更快或任何计时器方法纳秒秒或有任何其他方法? 请建议我一些想法......提前致谢

2 个答案:

答案 0 :(得分:0)

在单独的线程中保持阻塞Read()可能更可靠。

SetTimer()仅适用于低分辨率工作。它的分辨率实际上可以缩小,具体取决于更新版Windows中的电源设置。

如果您需要高分辨率计时器,Timer QueuesMultimedia Timers(具体而言,timeSetEvent())是可行的方法,两者的分辨率都可低至1毫秒。

答案 1 :(得分:0)

SetTimer的问题在于,您将在设置时间之前获得计时器通知,但您无法保证它将在您设置的时间。

首先,您依赖于系统的计时器分辨率,通常为15 ms。因此,即使您设置了10 ms,它也会在15 ms(或更长时间)内打勾。

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

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

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