如何将包含各种值的消息放在C#

时间:2017-12-19 09:02:21

标签: c# textbox serial-port

我收到了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");
        }

1 个答案:

答案 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条件才是真的!其余的几乎没用。