1

SerialPort クラスを使用して通信しているデバイス (デジタル インジケーター) があります。デバイスのドキュメントには、書き込みの間に 250 ミリ秒の遅延が必要であると記載されています。システムに余分な遅延を入れずにこれを強制する方法はありますか? これはおそらく、本当に小さなことを心配しすぎているように聞こえるかもしれませんが、これらの指標は 3 つあり、かなり頻繁に読み取っていますが、常にではありません。基本的に、250 ミリ秒以内に再送信しないように強制する良い方法はありますか?しかし、5 秒経過して送信しようとすると、理由もなくさらに 250 ミリ秒遅延したくありません。

考え?

4

3 に答える 3

2

シリアルポートへの書き込みを目的としたある種のクラス、おそらく単一の書き込みポイント (WriteToPort 関数など) が必要です。

その中で、書き込むたびに現在の時間を保存し、その遅延にロジックを使用できます。それで:

DateTime lastWritten;
TimeSpan timeBetweenWrites = new Timespan(0,0,0,0,250);
void WriteToDevice(string data)
{
    TimeSpan sinceLastWrite=DateTime.Now-lastWritten;
    if(sinceLastWrite<timeBetweenWrites)
        Thread.Sleep(timeBetweenWrites-sinceLastWrite);
    SerialPort.Write(data);
    lastWritten=DateTime.Now;
}
于 2010-01-11T19:31:51.757 に答える
1

スレッドを一時停止するとうまくいくはずです:

System.Threading.Thread.Sleep(250);

ただし、次回スレッドがスケジュールされることを保証できないため、これは少し不正確になる可能性があります。正確なタイミングが必要な場合は、スピン待機を使用することをお勧めします。

于 2010-01-11T19:28:19.550 に答える
0

各送信の前にタイムスタンプを取得します。250 ミリ秒 (現在 - その後) スリープします (明らかにゼロに固定されます)。それがあなたが求めているもののようです。

代わりに、OS のスケジューリングの問題で時間が平均 250 ミリ秒にならない、または正確に 250 ミリ秒からわずかにずれているなどのことを心配している場合は、もっと難しい問題があり、詳細を読む必要があります。ハード リアルタイム技術を使用します (追加のハードウェアを購入することもできます)。

于 2010-01-11T19:32:41.993 に答える