2017-12-19 35 views
-5

setzen Ich habe eine Nachricht Zeichenfolge von der Arduino erhalten und jetzt möchte ich die Nachricht teilen und in separaten Feldern.Wie Sie eine Nachricht mit verschiedenen Werten in separaten Textfeldern in C#

Die Botschaft lautet:

"DevID ~ erster Wert | $ DevEUI ~ 2. Wert | $ HWEUI ~ 3. Wert | $ AppKey ~ 4. Wert |"

Die Nachricht schlüpft nach jedem $ Zeichen. Der Code ist wie folgt, während der Laufzeit teilt er die Nachricht und die Zeichenfolge "Wert" erhielt jedes Mal den neuen Wert, aber alle Textfelder enthalten zur Zeit den gleichen Wert.

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

Schlagen Sie dies als eine Gelegenheit vor, um zu lernen, wie Sie den Debugger verwenden. Legen Sie in der ersten Zeile der Methode einen Haltepunkt fest und sehen Sie, wo der Fehler liegt. – LordWilmore

+0

Dies ist bestenfalls schrecklich. Ich würde wirklich in die 'string.split' Funktion schauen und lernen, wie man auf mehrere Tokens aufteilt. Das ist sehr schwer für die Augen, auch starten Sie den Debugger. – MethodMan

+0

nur als Tipp, es ist wirklich hilfreich (für uns und für sich selbst), Kommentare in Ihrem Code zu schreiben, die beschreiben, was diese Codezeile tun soll oder was Sie tun, was sie tun wird.Manchmal öffnen sie deine eigenen Augen und machen dir klar, dass du einen Fehler im Gedankenprozess selbst hast. Der Code ist einfach das Ergebnis dieses Gedankenprozesses :) Willkommen bei StackOverflow –

Antwort

2

IndexOf den Index des ersten Auftretens des Zeichens zurück. Deshalb erhältst du immer den gleichen Teilstring!

Sie sollten String.Split verwenden werden können, die Zeichenfolge zweimal aufzuspalten:

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

Erläuterung:

  • Die erste Spaltung gibt die verschiedenen Teile, die vom | Pipezeichen getrennt sind.

  • Die Sie wählen jedes Element aus diesem Array und teilen Sie jedes Element erneut durch die ~ Zeichen. Die Aufteilung eines Gegenstandes führt zu einem kleinen Feld von 2 Unterpunkten, und Ihr Wert wird auf der letzten Position gesetzt, die Sie einnehmen müssen.

jetzt können Sie die verschiedenen Werte in die entsprechenden Textfelder verteilen:

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

während der Laufzeit spaltet sich die Nachricht und die Zeichenfolge „Wert“ bekam den neuen Wert jedes Mal

Das ist nicht, was Ihr Code wirklich tut. Bisher führen Sie Ihre Operationen einmalig aus. Es gibt keine Schleife, die die Substring-Prozeduren wiederholen würde. Wenn Sie Ihren Debugger verwenden, werden Sie es sehen. Wie ich verstanden habe, erhalten Sie die gepostete Zeichenfolge als die gesamte Nachricht von ReadExisting in einer Zeichenfolge. Da Sie es einmal tun, wird command den Wert nur, dass es in dieser Zeile bekommt:

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

da Sie es nicht danach ändern nur 1 if Bedingung kann wahr sein! der Rest von ihnen ist praktisch nutzlos.

Verwandte Themen