C# / .NET4.0です。

シリアル通信で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]));
}
}

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/05/06 00:07:15
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント60pt

>もたつき無く送られている

>受信バッファにどんどん溜まっていく

 

これらの事からシリアル通信ポートからの受信は出来ているものと思われる

 

>表示されるのは少し前のデータで時間が経つとフリーズ

 

適切な改行コードの設定が行われていないために、

ReadLineは本来の1行分ではなく溢れるまで受け続けているものと思われる

すなわち、ReadLineは溢れた時点で取得終了となり、その後の処理が走っているため、

出力されるデータは少し前のものとなり、その間にもシリアルのバッファは溜まり続け……

 

NewLine="ほげほげ"(規定値は\r\n) を適切に設定すれば良いと思われる

id:after_333sec

送られてくるデータの末尾は規定値の\r\nなので特に設定していませんでした。

念のため\r\nで設定を明示したところ、10回に1回程度(ソフトを起動する回数)の割合でバッファに溜まらず来た分だけ表示されました。

ですがほとんどが解消されないままです。(バッファの溜まるスピードは起動するたびに変わっているようです。少しずつ溜まる時もあれば一気に溜まる時もあります)

PCのスペックの問題でしょうか?しかしCPU使用率30%、メモリも半分以上残ってるので考えにくいですが・・・

2011/05/04 06:54:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません