我收到了Arduino的消息字符串,现在我想拆分消息并将它们放在单独的框中。
消息是:
“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");
}
答案 0 :(得分:2)
IndexOf将返回角色第一次出现的索引。所以这就是为什么你总是得到相同的子串!
您应该使用String.Split将字符串拆分两次:
string [] values = meassageString.Split('|').Select(x=>x.Split('~').Last()).ToArray();
说明:
第一次拆分返回由|
竖线字符分隔的不同部分。
您从此数组中选择每个项目,然后再按~
字符拆分每个项目。一个项目的拆分将产生一小部分2个子项目,您的价值将位于最后一个位置。您需要采取此项目。
现在您可以将不同的值分配到相应的文本框中:
textBox2.Invoke(new Action(() => textBox2.Text = values[1]));
在运行时它会拆分消息,字符串“value”每次都获得新值
这不是你的代码真正做的。到目前为止,您只执行一次操作。没有循环会重复子串过程。如果您使用调试器,您将看到它。
据我所知,你将发布的字符串作为来自ReadExisting
in string的整个消息。由于您只执行一次,command
将只具有此行中的值:
String command = messageString.Substring(0, messageString.IndexOf('~'));
因为你之后不改变它只有1 if
条件才是真的!其余的几乎没用。