[ 動作環境 ]
・PCとUSBで繋がった通信機器のデータ受信API関数を、C#のTimerで回し、データを貰い、PCに表示させている。
・C# Timer周期のパラメタは 1に設定。(1ms)
・外部から入ってくるデータは、15ms周期
[ 発生現象 ]
PCとUSBで繋がった通信機器の受信Queueを見ると、受信を処理しきれず、Queueにデータがどんどん溜まり、データが詰まってしまう。
[ 質問 ]
1.C# Timerは1ms周期なので、1msの速度で処理されるのかと思いましたが違うでしょうか。
外部からのデータの周期を遅くすると、データ詰まりがなくなります。
2.処理速度を上げて、Queueにデータが溜まらないようにしたいですが、どこを改善すればよいでしょうか
1.USB速度の問題
2.Windowsの問題(Windows Form Applicationです。)
3.その他の原因
宜しくお願いします。
PCでの受信データを処理する時間は測定しましたか?
受信時には1セットのデータ(15ms周期で送信される一塊)しか受信していないのでしょうか?
ozwk>> すみません。PCでの受信データを処理する時間は、どうやって測定できるのでしょうか。
YAmaGNZ>> 今のところ、1対1の通信で検証しています。
溜まるってことは、タイマー周期でキューにあるデータ全部処理してない可能性はありそうですね
radian>> Timerを1msで回せば、通信機器からPCへのデータ渡しも1msで行われるかと考えました。何が問題ですかね。
1対1とは1つのPCに1つのUSB機器ということですか?
もしそういう意味での返答でしたら、私が聞きたかったことと異なります。
例えば、タイマーイベントが30ms間隔で起こったとします。
そうすると、USB機器は15ms間隔でのデータ送信ですので、2回分のデータが受信待ちとなっているはずです。
この時、タイマーイベントでの受信処理で1回分のデータしか受信していないのかどうかを聞きたかったのです。
もしそうなのであれば、2回分受信してしまえば、キューには溜まらないのではないでしょうか?
処理時間の計測は、まさに名前のままの Stopwatch クラスがあります
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.stopwatch?view=netcore-3.1
実際にどのようなデータかは存じませんので、時間的な要素が重要なものであった場合は、タイマー間隔で受信バッファにあるだけ受信するという方法が適切ではない可能性もありますので、そのあたりはご自身で検討してください。
15ms周期の一つのデータしか送られてません。
従って1msのTime Eventであれば、データがはけるはずだと思いましたが、何故かQueが溜まります。
送信側ではなく、受信側の話です。
タイマーに関しては他の方が回答していらっしゃるとおり1msでの動作は保障されません。
ですので、Inervalを1msと設定しても実際にはそれより長い間隔でタイマーイベントが発生します。
そこで、15ms周期で1つのデータを送信したら、受信側が30ms周期だった場合は「2つデータが溜まります」よね?
そこで、タイマーイベントにて1つのデータしか受信しない場合、1つのデータが溜まります。
次にタイマーイベントが発生するのが30ms後ですから、次のイベント時には3つのデータがあることになります。
このように繰り返すとどんどんデータが溜まりますので、イベント時にまとめて受信しましょうという話です。
回答1件
あなたの回答
tips
プレビュー