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();
}
}
}
如果要包含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;
}
希望这是有道理的。