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

本文关键字:拆分 输出 单独 文本 数据 | 更新日期: 2023-09-27 18:05:42

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

传入内容如下所示:CCD_ 1,其中,:表示数据的开始

*首次出现表示传感器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(对象发送方,System.IO.Ports.SerialDataReceivedEventArgs({//对于1个传感器string SensorData=可用端口.ReadLine((;这BeginInvoke(新的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();
                }
            } 
        }

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

如果要包含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

我这里没有Visual Studio,但你应该试试这样的东西:

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

这应该会给你这个:

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

提取数据的方式没有什么问题,但只要确保从串行端口获得的数据真正遵循模式,是否可以在读取到数据末尾之前继续编程?

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

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;
}

希望这是有道理的。