2017-12-19 4 views
-5

Arduinoからメッセージ文字列を受け取ったので、メッセージを分割して別々のボックスに入れたいと思います。さまざまな値を含むメッセージをC#の別々のテキストボックスに入れる方法

メッセージは次のとおりです。

"DEVID〜最初の値| $ DevEUI〜第二値| $ HWEUI〜第三値| $のAppKey〜第四値|"

メッセージはすべて$の後に表示されます。コードは次のとおりですが、実行時にはメッセージが分割され、 "value"という文字列には常に新しい値が返されますが、現時点ではすべてのテキストボックスに同じ値が含まれています。

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort Arduino = (SerialPort)sender; 

    string indata = Arduino.ReadExisting(); 
    Debug.WriteLine("Data Received:"); 
    Debug.Print(indata); 

    isConnected = true; 
    RxString = RxString + indata; 
    int endmarkerPos = RxString.IndexOf('|'); 
    if(endmarkerPos != -1) 
    { 
     //now pack everything till endmarker into messageString and delete this part from RxString 
     messageString = RxString.Substring(0, RxString.IndexOf('|')); 
     Debug.Print(messageString); 
     RxString = RxString.Substring(endmarkerPos + 1); 
    } 

    int startmarkerPos = messageString.IndexOf('$'); 
    if (startmarkerPos != -1) 
    { 
     messageString = messageString.Substring(startmarkerPos +1); 
     String command = messageString.Substring(0, messageString.IndexOf('~')); 
     String value = messageString.Substring(messageString.IndexOf('~') + 1); 
     Debug.Print("---parsed: command: " + command + "\t value: " + value); 
     Debug.Print("the trimmed message is: " + messageString); 

     if (string.Compare(command , " DevID") == 1) 
     { 
      //messageString = messageString.Substring(messageString.IndexOf('~') + 1); 

      textBox1.Invoke(new Action(() => textBox1.Text = value)); 
      //textBox1.Text = value; 
      messageString = messageString.Substring(messageString.IndexOf('~') + 1); 
      Debug.Print("1st block"); 
     } 
     if (string.Compare(command, " DevEUI") == 1) 
     { 
      //messageString = messageString.Substring(messageString.IndexOf('~') + 1); 

      textBox2.Invoke(new Action(() => textBox2.Text = value)); 
      //textBox1.Text = value; 
      messageString = messageString.Substring(messageString.IndexOf('~') + 1); 
      Debug.Print("2nd block"); 
     } 
     if (string.Compare(command, " HWEUI") == 1) 
     { 
      //messageString = messageString.Substring(messageString.IndexOf('~') + 1); 

      textBox2.Invoke(new Action(() => textBox3.Text = value)); 
      //textBox1.Text = value; 
      messageString = messageString.Substring(messageString.IndexOf('~') + 1); 
      Debug.Print("3rd block"); 
     } 
     if (string.Compare(command, " AppKey") == 1) 
     { 
      //messageString = messageString.Substring(messageString.IndexOf('~') + 1); 

      textBox2.Invoke(new Action(() => textBox4.Text = value)); 
      //textBox1.Text = value; 
      messageString = messageString.Substring(messageString.IndexOf('~') + 1); 
      Debug.Print("4th block"); 
     } 
+3

これは、デバッガの使い方を学ぶ機会としてお勧めします。メソッドの最初の行にブレークポイントを設定し、どこが間違っているのかを確認します。 – LordWilmore

+0

これはせいぜい恐ろしいことです。私は 'string.split'関数を調べ、複数のトークンを分割する方法を学びます。これは目に非常に難しいですが、また、デバッガを使用して開始します。 – MethodMan

+0

ちょうどヒントとして、このコード行が何を想定しているのか、それが何をすると思われるのかを記述するコメントをコードに書き込むことは、(私たちにとっては、あなた自身にとって)本当に役に立ちます。時には彼らはあなた自身の目を開き、思考過程自体に間違いがあることを認識させます。コードは単にこの思考プロセスの結果です:) Welcome to StackOverflow –

答えて

2

IndexOfは、文字の最初の出現のインデックスを返します。だからこそあなたはいつも同じ部分文字列を得るのです!

あなたは二回、あなたの文字列を分割するString.Splitを使用することができる必要があります。

string [] values = meassageString.Split('|').Select(x=>x.Split('~').Last()).ToArray(); 

説明:

  • 最初の分割が|パイプ文字で区切られて異なる部分を返します。

  • この配列から各項目を選択し、各項目を~文字でもう一度分割します。 1つのアイテムの分割は、2つのサブアイテムの小さな配列になり、あなたの価値は最後のポジションに置かれます。これはあなたが取る必要があります。

今あなたが適切なテキストボックスに異なる値を配布することができます:それはメッセージを分割しないと、文字列「の値が」

新しい値を毎回持って実行時に

textBox2.Invoke(new Action(() => textBox2.Text = values[1])); 

これはあなたのコードが実際に行うことではありません。これまでは一度操作を実行しました。 Substringプロシージャを繰り返すループはありません。デバッガを使用すると、それが表示されます。 私が理解しているように、投稿された文字列をメッセージ全体としてReadExistingから文字列で取得します。あなたが一度それを行うので、commandは、それがこのラインに入っていることだけで価値があります:あなただけ後でそれを変更しないので

String command = messageString.Substring(0, messageString.IndexOf('~')); 

を1 if条件が真であることができます!残りの部分は実質的に役に立たない。

関連する問題