0

当我尝试访问我使用计数器变量提供实时数据的列表时,我收到了 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# 新手,因此非常感谢您的帮助。

4

3 回答 3

1

是因为在您的 DisplayVal 方法中您将 ctr 设置为 ctr + 3?

如果是这样,那么当您尝试访问它时它将超出范围,因为它下次尝试从第三个值开始访问列表。

于 2013-03-19T09:55:55.587 回答
0

您可能在此处阅读了不完整的消息:

RxString = serialPort1.ReadExisting();

因此,可能不是“$1032,432,541,145”,而是“$1032,432,5”,您的异常就会发生。

您应该在协议中添加一些消息终止符号。这样您就可以看到您收到了完整的消息。

于 2013-03-19T09:53:07.470 回答
0

您正在附加由 Environment.NewLine 分隔的行

当你解析时,你用逗号','分开。鉴于以下两行:

"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(","));
于 2013-03-19T09:56:32.460 回答