c#中动态列表中的超出范围异常
本文关键字:范围 异常 动态 列表 | 更新日期: 2023-09-27 18:04:34
当我试图访问我使用计数器变量提供实时数据的列表时,我得到一个ArgumentOutofRangeException。这是我的部分代码
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort1.ReadExisting();
RxString = RxString.Replace("$", "");
this.Invoke(new EventHandler(DisplayText));
}
private void DisplayText(object sender, EventArgs e)
{
richTextBox1.AppendText(RxString);
parsed(ref ctr);
richTextBox2.Text = String.Join(Environment.NewLine, stringList);
}
public void parsed(ref int ctr)
{
string line;
line = richTextBox1.Text;
stringList= new List<String(line.Split(','));
displayval(ref int ctr);
}
public void displayval(ref int ctr)
{
line = RxString;
stringList= new List<String>(line.Split(','));
richTextBox3.AppendText("'n Pressure:" + stringList[ctr]);
ctr++;
richTextBox3.AppendText("'n Accelerometer:" + stringList[ctr]);
ctr++;
richTextBox3.AppendText("'n Temperature:" + stringList[ctr]);
ctr++;
richTextBox3.AppendText("'n Height:" + stringList[ctr]);
ctr++;
}
我从Arduino得到一个实时串行输入,我想解析CSV值,它像$1032,432,541,145。
我能够将其解析为单个值,但后来我无法使用ctr访问列表。我是c#新手,所以非常感谢帮助。
是因为在你的DisplayVal方法中你将ctr设置为ctr + 3吗?
如果是,那么当你试图访问它时,它将超出范围,因为它下次试图从第3个值开始访问列表
您可能在这里读到一个不完整的消息:
RxString = serialPort1.ReadExisting();
所以不是"$1032,432,541,145",而是"$1032,432,5",你的异常就会发生。
你应该在你的协议中添加一些消息终止符号。这样您就可以看到您收到了完整的消息
您正在追加以Environment分隔的行。换行符
解析时,用逗号","分隔。给定以下两行:
"value1;value2;value3;value4"
"value5;value6;value7;value8"
您解析的stringList将具有值
"value1"
"value2"
"value3"
"value4'nvalue5" << here, last value of 1st line followed by NewLine
followed by first value of second line
"value6"
"value7"
"value8"
我建议您单独解析每一行。
例如,如果您知道您的值将不包含Environment。NewLine字符串,你可以先用NewLine分开,然后用","分开:
var lines = richTextBox.Text.Split(Environment.NewLine)
stringList = new List<string>();
foreach (var l in lines)
stringList.AddRange(l.Split(","));