C#:将传入的串行数据和输出拆分为单独的文本框

时间:2013-03-24 23:32:55

标签: c#

我正在从C#中的串口读取数据。目前我的微控制器上有两个传感器,我在应用程序中从两个传感器接收数据。

传入看起来像这样: :*123*188;其中, :表示数据的开头

第一次出现

*表示传感器1数据

第二次出现

*表示传感器2数据

;代表数据结尾

摆脱我用过的标点符号:

var DataPacket = SensorData.Split(new[]{":",";"},StringSplitOptions.RemoveEmptyEntries) 

现在我离开了:* 123 * 188。如何将两个传感器数据分开并将它们放在不同的文本框中。

我试过了:

foreach(var Data in DataPacket)
{
    string bits[] = Data.Split(new[] {"*"},StringSplitOptions.RemoveEmptyEntries);     
}

但是,textbox1.Text = bits[0]正在同一个框中读取传感器1和传感器2的值。并且bits[1]不受约束。

请指导我解决这个问题。

编辑:这是读取数据并尝试相应拆分的扩展代码:

private void OnReceive(object sender,System.IO.Ports.SerialDataReceivedEventArgs s)         {                 // FOR 1 SENSOR                 string SensorData = AvailablePort.ReadLine();                 this.BeginInvoke(new LineReceivedEvent(LineReceived),SensorData);

    }

    private delegate void LineReceivedEvent(string SensorData);

    private void LineReceived(string SensorData)
    {

       /*** FOR SECOND SENSOR****************/ 
        int startReading = SensorData.IndexOf(":");
        int endReading = SensorData.IndexOf(";");
        /********                   ************/

        //int userRange = Convert.ToInt32(Temp_Range.SelectedValue);
        //int data = Int32.Parse(SensorData);


        /*** FOR SECOND SENSOR ************************************************/
        var DataPacket = SensorData.Split(new[] { ":", ";" }, StringSplitOptions.None);

        foreach (var Data in DataPacket)
        {
            //textBox1.Text = Data;
            //TRYING TO READ MORE THAN 1 SENSOR HERE
            var newData = SensorData.Split(new[] { "*" }, StringSplitOptions.None);
            while(true)
            {
                foreach (var data in newData)
                {
                    textBox1.Text = data[0].ToString();
                }
            } 
        }

4 个答案:

答案 0 :(得分:0)

如果要包含null或空元素,请不要添加StringSplitOptions.RemoveEmptyEntries。 例如:

Without remove
*121
a[0]=null
a[1]=121
121*
a[0]=121
a[1]=null
111*222
a[0]=111
a[1]=222


with remove
*121
a[0]=121
a[1]=OutOfRangeException
121*
a[0]=121
a[1]=OutOfRangeException
111*222
a[0]=111
a[1]=222

答案 1 :(得分:0)

我这里不是Visual Studio,但你应该尝试这样的事情:

string bits[] = Data.Split("*");

这应该给你这个:

bits[0] = null;
bits[1] = 123;
bits[2] = 188;

答案 2 :(得分:0)

虽然这里似乎有一些代码含糊不清,但我认为您需要更改以下代码行:

var newData = SensorData.Split(new[] { "*" }, StringSplitOptions.None);
while(true)
{
      foreach (var data in newData)
      {
            textBox1.Text = data[0].ToString(); // Remove the index from data as this is not a collection but a variable
      }
} 

我认为您应该按如下方式重写这段代码:

String[] newData = SensorData.Split(new[] { "*" }, StringSplitOptions.RemoveEmptyEntries);
for(int i=0; i<newData.Length; i++)
{
    textBox1.Text = newData[i]; // You will need to manipulate the textboxes better here, since the
}

现在我可能在理解上错了,但我认为除了将这些值分配给文本框的更改之外,这应该对你有用,因为你似乎已经对它们进行了硬编码。例如,for循环可以替换为这样的东西:

switch(newData.Length)
{
    case 0:
        break;
    case 1:
        textbox1.Text = newData[0];
        break;
    case 2:
        textbox1.Text = newData[0];
        textbox2.Text = newData[1];
        break;
    ...
    case n:
        break;
}

希望这是有道理的。

答案 3 :(得分:0)

提取数据的方式没有任何问题,但只是确保从串口获得的数据确实遵循了模式,是否有可能在读取到数据末尾之前继续编程?