1

C# のシリアル ポートからデータを読み込んでいます。現在、マイクロコントローラーに 2 つのセンサーがあり、アプリケーションで両方のセンサーからデータを受信して​​います。

着信は次のようになります。 :*123*188;ここで、 :データの開始を表します

*最初の出現はセンサー 1 のデータを示します

*2 番目のオカレンスは、センサー 2 のデータを示します

;データの終わりを表す

私が使用した句読点を取り除くには:

var DataPacket = SensorData.Split(new[]{":",";"},StringSplitOptions.RemoveEmptyEntries) 

今、私は去りました: *123*188。2 つのセンサー データを分離して、別のテキスト ボックスに入れる方法を教えてください。

私が試してみました:

foreach(var Data in DataPacket)
{
    string bits[] = Data.Split(new[] {"*"},StringSplitOptions.RemoveEmptyEntries);     
}

ただし、textbox1.Text = bits[0]同じボックスでセンサー 1 とセンサー 2 の両方の値を読み取っています。そしてbits[1]範囲外です。

これを解決するために私を導いてください。

編集:データを読み取り、それに応じて分割しようとする拡張コードは次のとおりです。

private void OnReceive(object sender, System.IO.Ports.SerialDataReceivedEventArgs s) { //FOR 1 SENSOR 文字列 SensorData = AvailablePort.ReadLine(); this.BeginInvoke(new LineReceivedEvent(LineReceived), SensorData);

    }

    private delegate void LineReceivedEvent(string SensorData);

    private void LineReceived(string SensorData)
    {

       /*** FOR SECOND SENSOR****************/ 
        int startReading = SensorData.IndexOf(":");
        int endReading = SensorData.IndexOf(";");
        /********                   ************/

        //int userRange = Convert.ToInt32(Temp_Range.SelectedValue);
        //int data = Int32.Parse(SensorData);


        /*** FOR SECOND SENSOR ************************************************/
        var DataPacket = SensorData.Split(new[] { ":", ";" }, StringSplitOptions.None);

        foreach (var Data in DataPacket)
        {
            //textBox1.Text = Data;
            //TRYING TO READ MORE THAN 1 SENSOR HERE
            var newData = SensorData.Split(new[] { "*" }, StringSplitOptions.None);
            while(true)
            {
                foreach (var data in newData)
                {
                    textBox1.Text = data[0].ToString();
                }
            } 
        }
4

4 に答える 4

0

null または空の要素を含める場合は、StringSplitOptions.RemoveEmptyEntries を追加しないでください。元:

Without remove
*121
a[0]=null
a[1]=121
121*
a[0]=121
a[1]=null
111*222
a[0]=111
a[1]=222


with remove
*121
a[0]=121
a[1]=OutOfRangeException
121*
a[0]=121
a[1]=OutOfRangeException
111*222
a[0]=111
a[1]=222
于 2013-03-24T23:46:14.087 に答える
0

ここにはコードがあいまいであるようですが、次のコード行を変更する必要があると思います。

var newData = SensorData.Split(new[] { "*" }, StringSplitOptions.None);
while(true)
{
      foreach (var data in newData)
      {
            textBox1.Text = data[0].ToString(); // Remove the index from data as this is not a collection but a variable
      }
} 

このコードを次のように書き直す必要があると思います。

String[] newData = SensorData.Split(new[] { "*" }, StringSplitOptions.RemoveEmptyEntries);
for(int i=0; i<newData.Length; i++)
{
    textBox1.Text = newData[i]; // You will need to manipulate the textboxes better here, since the
}

今、私は理解が間違っているかもしれませんが、これらの値をテキストボックスに割り当てる際の変更を除いて、これらの値をハードコーディングしたように見えるので、これはうまくいくはずです。たとえば、for ループは次のように置き換えることができます。

switch(newData.Length)
{
    case 0:
        break;
    case 1:
        textbox1.Text = newData[0];
        break;
    case 2:
        textbox1.Text = newData[0];
        textbox2.Text = newData[1];
        break;
    ...
    case n:
        break;
}

これが理にかなっていることを願っています。

于 2013-03-24T23:57:19.133 に答える
0

ここでは Visual Studio を使用していませんが、次のようなことを試してみてください。

string bits[] = Data.Split("*");

これはあなたにこれを与えるはずです:

bits[0] = null;
bits[1] = 123;
bits[2] = 188;
于 2013-03-24T23:49:52.990 に答える
0

データを抽出する方法に問題はありませんが、シリアルポートから取得したデータが実際にパターンに従っていることを確認してください。データの最後まで読み取る前にプログラムを続行することは可能ですか?

于 2013-03-25T00:44:54.737 に答える