シリアル通信で10msごとに送られてくるデータを表示するものです。
ですが、表示されるのは少し前のデータで時間が経つとフリーズしてしまいました。
調べたところ受信バッファにどんどん溜まっていくのが確認できました。
ちなみにターミナルソフトで確認するときちんと10msごとに、もたつき無く送られているようで、C#のほうで処理しきれていないようです。
解決策(処理の高速化)を教えてください。よろしくお願いします。
(コードの重要と思われるところ以外は削除しています)
受信するデータは "1,2,3,4,5,6,7,8,9,10" というコンマで区切られた10個の数字です。
private delegate void MyDelegate(string[] ReceiveData);
private void serialPort1_DataReceived()
{
temp = this.serialPort1.ReadLine();
ReceiveData = temp[0].Split(',');
if (ReceiveData.Length == 10) Invoke(new MyDelegate(WriteText), new Object[] { ReceiveData });
}
private void WriteText(string[] ReceiveData)
{
if (offset_flag)
{
offset[0] = ReceiveData[0];
(1~7同様に)
offset[8] = ReceiveData[8];
offset_flag = false;
}
else
{
this.label10.Text = Convert.ToString(int.Parse(ReceiveData[0]) - int.Parse(offset[0]));
(1~7同様に)
this.label18.Text = Convert.ToString(int.Parse(ReceiveData[8]) - int.Parse(offset[8]));
}
}
>もたつき無く送られている
>受信バッファにどんどん溜まっていく
これらの事からシリアル通信ポートからの受信は出来ているものと思われる
>表示されるのは少し前のデータで時間が経つとフリーズ
適切な改行コードの設定が行われていないために、
ReadLineは本来の1行分ではなく溢れるまで受け続けているものと思われる
すなわち、ReadLineは溢れた時点で取得終了となり、その後の処理が走っているため、
出力されるデータは少し前のものとなり、その間にもシリアルのバッファは溜まり続け……
NewLine="ほげほげ"(規定値は\r\n) を適切に設定すれば良いと思われる
送られてくるデータの末尾は規定値の\r\nなので特に設定していませんでした。
念のため\r\nで設定を明示したところ、10回に1回程度(ソフトを起動する回数)の割合でバッファに溜まらず来た分だけ表示されました。
ですがほとんどが解消されないままです。(バッファの溜まるスピードは起動するたびに変わっているようです。少しずつ溜まる時もあれば一気に溜まる時もあります)
PCのスペックの問題でしょうか?しかしCPU使用率30%、メモリも半分以上残ってるので考えにくいですが・・・