0

カウンター変数を使用してリアルタイム データをフィードするリストにアクセスしようとすると、ArgumentOutofRangeException が発生します。これが私の部分的なコードです

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    RxString = serialPort1.ReadExisting();
    RxString = RxString.Replace("$", "");
    this.Invoke(new EventHandler(DisplayText));
}


private void DisplayText(object sender, EventArgs e)
{
    richTextBox1.AppendText(RxString);
    parsed(ref ctr);
    richTextBox2.Text = String.Join(Environment.NewLine, stringList);
}

public void parsed(ref int ctr)
{
    string line;
    line = richTextBox1.Text;

    stringList= new List<String(line.Split(','));
    displayval(ref int ctr);
}

public void displayval(ref int ctr)
{

   line = RxString;

   stringList= new List<String>(line.Split(','));
   richTextBox3.AppendText("\n Pressure:" + stringList[ctr]);
   ctr++;
   richTextBox3.AppendText("\n Accelerometer:" + stringList[ctr]);
   ctr++;
   richTextBox3.AppendText("\n Temperature:" + stringList[ctr]);
   ctr++;
   richTextBox3.AppendText("\n Height:" + stringList[ctr]);
   ctr++;
}

Arduino からリアルタイムのシリアル入力を取得しています。$1032,432,541,145 のような CSV 値を解析したいと考えています。

それを単一の値に解析することはできますが、後で ctr を使用してリストにアクセスできません。私はC#が初めてなので、助けていただければ幸いです。

4

3 に答える 3

1

DisplayValメソッドでctrをctr+3に設定しているためですか?

その場合、次回は3番目の値からリストにアクセスしようとしているため、アクセスしようとすると範囲外になります。

于 2013-03-19T09:55:55.587 に答える
0

Environment.NewLineで区切られた行を追加しています

解析するときは、コンマ'、'で分割します。次の2行が与えられます:

"value1;value2;value3;value4"
"value5;value6;value7;value8"

解析されたstringListには値が含まれます

"value1"
"value2"
"value3"
"value4\nvalue5" << here, last value of 1st line followed by NewLine 
                    followed by first value of second line
"value6"
"value7"
"value8"

各行を個別に解析することをお勧めします。

たとえば、値にEnvironment.NewLine文字列が含まれないことがわかっている場合は、最初にNewLineで分割し、次にそれぞれを「、」で分割できます。

var lines = richTextBox.Text.Split(Environment.NewLine)
stringList = new List<string>();
foreach (var l in lines)
    stringList.AddRange(l.Split(","));
于 2013-03-19T09:56:32.460 に答える
0

ここで不完全なメッセージを読んでいる可能性があります。

RxString = serialPort1.ReadExisting();

したがって、「$1032,432,541,145」の代わりに「$1032,432,5」となり、例外が発生します。

プロトコルにメッセージ終了記号を追加する必要があります。完全なメッセージを受信したことを確認できるようにします。

于 2013-03-19T09:53:07.470 に答える