2011-07-13 8 views
0

FIFOモードのftdiチップと私の仕事のためのD2xxドライバを持つハードウェアを使用しています。ハードウェアは、19.5KHz〜312.5KHzのレートでデータバイトを送信しています。私のアプリケーションソフトウェア(MFC C++)は、これらのバイトをさまざまな速度で読み込むことになっています。私は、10ミリ秒の値を持つSettimerとOntimerメソッドを使用しています。データバイトを読み込み、OnTimer関数で処理します。私の質問はSettimerメソッドによる高速データ読み取りの問題

1> settimerの方法です。異なるシステムでも、両方のシステムがXP SP3であっても、異なる結果が得られます。 1つのシステムが欠落することなくすべてのバイトを読み取っていますが、別のシステムではデータが欠落します。このタイマーはOSやシステムのハードウェアに依存していますか?

2>私がsettimerに設定できる最小値は10msだから、10msごとに私はdata.Ifを読むことができますが、私は制御できないドライババッファにオーバーフローがあります。任意のタイマー方法でマイクロ秒またはナノ秒でより速く読むか、他の方法がありますか? いくつかのアイディアを提案してください...事前に感謝

答えて

0

別スレッドでRead()をブロックし続けるのがより信頼できるでしょう。

SetTimer()は、低解像度の作業のためのものです。その解像度は、Windowsの最新バージョンの電源設定に応じて実際には縮小されます。

高解像度タイマーを使用する場合は、Timer QueuesまたはMultimedia Timers(具体的にはtimeSetEvent())のいずれかの解像度が1msまで可能です。

0

SetTimerの問題は、設定した時間よりも早くタイマー通知を受け取ることですが、設定した時刻に正確になることは保証できません。

まず、システムのタイマーの解像度に依存します(通常は15msです)。したがって、たとえ10ミリ秒を設定しても、15ミリ秒(またはそれ以上)になります。

第2に、処理するメッセージがなくなるとタイマー通知が送信されます。したがって、メッセージループでは、キューにメッセージがなくなると、システムはタイマーが設定されているかどうか、およびタイマーが設定されているかどうかを調べます。存在する場合は、1つの通知を送信します。つまり、あなたのプログラムが他のことをやっていると忙しいときは、1つの通知で1つまたは複数の「ティック」と「グループ化」を失い、たとえば75ミリ秒で発生する可能性があります。

結論は、SetTimerは高解像度のニーズに対応する信頼性の高いタイマー方法ではありません。

別のスレッドのように他のソリューションを見なければならない場合があります。

+0

[リンク](http://www.flounder.com/time.htm)(WM_TIMERセクションを参照) – MikMik

関連する問題