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

Problem with High speed data read with Settimer method

本文关键字:数据 问题 高速 读取 Settimer 方法      更新时间:2023-10-16

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

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

2>据我所知,我可以为settimer设置的最小值是10毫秒,所以每10毫秒我可以读取数据。如果我不读快,会有溢出的驱动程序缓冲区,我无法控制。所以我可以读得更快在微秒或纳秒与任何计时器方法或有任何其他方法?请给我提个建议……提前感谢

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

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

如果你想要高分辨率的定时器,定时器队列或多媒体定时器(具体来说,timeSetEvent())是走的路,这两者都可以有一个分辨率低至1ms

SetTimer的问题是,你将得到定时器通知不早于你设置的时间,但你不能保证它会在你设置的确切时间。

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

第二,当没有更多的消息要处理时发送定时器通知。因此,在消息循环中,当队列中没有更多消息时,系统会查看是否设置了计时器,以及它是否已打勾。如果有,它会发送一个通知。问题是,如果您的程序忙于做其他事情,它可能会丢失一个或多个"tick",并将它们"分组"到一个通知中,这种情况可能发生在75毫秒。

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

所以你可能不得不考虑其他的解决方案,比如一个单独的线程来读取。