将serialport数据拆分为不同的文本框C#

时间:2018-04-11 23:15:54

标签: c# string split

我是c#的新手。

我正在使用Nucleo板通过串口将数据发送到我的GUI。数据包括脉率,步数和体温。

此处的代码可以完全正常地将所有数据显示到单个文本框中,但我希望在不同的文本框中显示每个值

这是传入数据的样子

S0E // where "S" is for steps and "E" is for the end 
P5E  //  where "P" is for pulse rate and "E" is for the end 
T22.5E //  where "T" is for body temp. and "E" is for the end 

以下是我正在使用的代码:

  private void showbtn_Click(object sender, EventArgs e)    //Showbtn click
    {
        text.Clear();   //clears the text in the textbox
        bool foundUser = false;   // sets the boolean foundUser to false
        int userindex = 0; // sets interger to zero
        for (int i = 0; i < userlist.Count; i++)   
        {
            if (userlist[i].name.Equals(Nametb.Text))  // if the user entered name equals to the name in the list
            {
                foundUser = true;
                userindex = i;
            }
        }
        if (foundUser == true)
        {
            string userText;     // the following lines of code displays the user details in the textbox
            userText = "name :" + userlist[userindex].name + "user :" + Environment.NewLine + "age:" + userlist[userindex].age +
                Environment.NewLine + " gender:" + userlist[userindex].gender + Environment.NewLine + "height:" + userlist[userindex].height + 
                Environment.NewLine + "weight:" + userlist[userindex].weight + Environment.NewLine + "BMI :" + userlist[userindex].bmI;
            text.Text = userText;
        }
        else
        {
            text.Text = "no user found";  // if the user not found displays as "no user Found"
        }

        t = comboBox1.Text.ToString();

        sErial(t);
    }

        private void button2_Click(object sender, EventArgs e)   // searches for available com ports
    {
        string[] ports = SerialPort.GetPortNames();
        foreach (string port in ports)
        {
            comboBox1.Items.Add(port);   // adds them to the combo box
        }
    }
    string t;   
    private SerialPort SerialPort1;


    void sErial(string Port_name)
    {
        SerialPort1 = new SerialPort(Port_name, 9600, Parity.None, 8, StopBits.One);    //serial port properties
        SerialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);   
        SerialPort1.Open();   //opens serial port
    }

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

        string w = serialPort1.ReadLine();   // assigns the data from the serial port to a string


        if (w != String.Empty)
        {
            if (abort == false)
            {

                Invoke(new Action(() => rt1.AppendText(w)));   // displays the data in a textbox
            }
        }


    }

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您将从外部设备接收数据,并希望拆分包含由单个字符分隔的多个数字数据元素的字符串,以便您可以将结果显示到不同的文本框。

这是从嵌入式系统接收数据并需要学习如何在主机PC上处理数据的人要解决的典型问题,但对C#编程来说是新手。

有很多不同的方法可以做到这一点。既然你说你可以在一个文本框中接收和显示整个字符串,我将只关注如何将它拆分并在三个不同的richTextBox中显示这些部分。

对于c#beginner,string.splitsubstring是分解字符串的非常简单的方法。这是一个使用string.split的简单示例。

我为你做了一个完整的例子:你可以在下面看到它有效。首先,我创建了一个包含三个富文本框的表单,名为rt1,rt2和rt3,以及一个名为tbInput的输入文本框和一个名为btnSplit的按钮。

然后在设计器中,我双击按钮为btnInput_click添加一个事件处理程序,并将下面的代码添加到该处理程序中。那就是它!

enter image description here

private void btnSplit_Click(object sender, EventArgs e)
{
    string blah = tbInput.Text;
    tbInput.Clear();
    var lst = blah.ToUpper().Split('E').ToList();
    foreach (var item in lst)
        if (item.Trim().StartsWith("S"))
            rt1.AppendText($"Steps: {item.Remove(0, 1)} \n");
        else if (item.Trim().StartsWith("T"))
            rt2.AppendText($"Temperature: {item.Remove(0, 1)} \n");
        else if (item.Trim().StartsWith("P"))
            rt3.AppendText($"Pulse: {item.Remove(0, 1)} \n");
}

代码将输入转换为大写,将字符串拆分为字母&#34; E&#34;并将结果分配给一个列表,因此给定包含三个&#34; E&#34; s的起始字符串,您现在将拥有一个包含三个字符串的列表:

item01 == S111
item02 == T98.6
item03 == P70

然后我修剪前导和尾随空格,并根据前导字符将结果分配给三个RichTextBox中的一个。在将结果附加到文本框之前,我使用item.Remove(0,1)删除前导字符。我使用插值将结果嵌入到我选择的字符串中。

我应该指出,除非您在UI线程以外的线程上运行此代码,否则您不需要使用Action委托,也不需要调用任何内容。如果您在主线程上,只需将文本附加到文本框中即可。

如果 计划对在UI上运行的控件进行跨线程调用,则Action<>委托不是执行此操作的正确方法。如果这是您尝试做的事情,请查看MethodInvoker()。但是,我强烈建议您不要尝试使用多个线程,直到您作为程序员非常高级,并阅读了有关该主题的几本书。对于像这样的简单项目,它们当然不需要它们:)

这有帮助吗?

答案 1 :(得分:0)

@ craig.Feied

这是我改变的部分。 再次感谢您的帮助。

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

                var rt1 = new RichTextBox();
                var rt2 = new RichTextBox();
                var rt3 = new RichTextBox();
                string blah = serialPort1.ReadLine();

                var lst = blah.Split('E').ToList();
                foreach (var item in lst)
                    if (item.Trim().StartsWith("S"))
                        rt1.AppendText($"Steps: {item.Remove(0, 1)} \n");
                    else if (item.Trim().StartsWith("T"))
                        rt2.AppendText($"Temperature: {item.Remove(0, 1)} \n");
                    else if (item.Trim().StartsWith("P"))
                        rt3.AppendText($"Pulse: {item.Remove(0, 1)} \n");

        }