我正在从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();
}
}
}
答案 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)
提取数据的方式没有任何问题,但只是确保从串口获得的数据确实遵循了模式,是否有可能在读取到数据末尾之前继续编程?