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");
}
これは、デバッガの使い方を学ぶ機会としてお勧めします。メソッドの最初の行にブレークポイントを設定し、どこが間違っているのかを確認します。 – LordWilmore
これはせいぜい恐ろしいことです。私は 'string.split'関数を調べ、複数のトークンを分割する方法を学びます。これは目に非常に難しいですが、また、デバッガを使用して開始します。 – MethodMan
ちょうどヒントとして、このコード行が何を想定しているのか、それが何をすると思われるのかを記述するコメントをコードに書き込むことは、(私たちにとっては、あなた自身にとって)本当に役に立ちます。時には彼らはあなた自身の目を開き、思考過程自体に間違いがあることを認識させます。コードは単にこの思考プロセスの結果です:) Welcome to StackOverflow –