2013-03-19 36 views
0

當我嘗試訪問使用計數器變量實時輸入數據的列表時,出現ArgumentOutofRangeException。這是我的部分代碼C中的動態列表超出範圍異常#

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實時串行輸入,我想分析其即將像$ 1032,432,541,145的CSV值。

我能夠將它解析爲單個值,但後來我無法使用ctr訪問列表。我是C#的新手,所以非常感謝幫助。

+0

在哪一行,你得到的異常?你爲什麼使用ref參數? – Rik 2013-03-19 09:55:47

+0

嘗試使用ctr [index]來訪問數組的每個段。像ctr [0]等等... – 2013-03-19 09:56:13

回答

0

你讀一個不完整的信息在這裏它是可能的:

RxString = serialPort1.ReadExisting(); 

所以不是「$ 1032,432,541,145」也可能是「1032,432,5 $」,將出現你的異常。

您應該在協議中添加一些消息終止符號。這樣你就可以看到你收到了一條完整的消息。

1

是因爲在你的DisplayVal方法中你將ctr設置爲ctr + 3?

如果是這樣,那麼當您嘗試訪問它時它將超出範圍,因爲它正在嘗試下次從第三個值開始訪問列表。

+0

我已經聲明ctr全局爲0,所以ctr在下一行被解析時進入列表的第4個值。 – MoDrags 2013-03-20 06:46:06

+0

是的,但在下一次運行時它將從7開始,除非您將它重新初始化爲0. – uNople 2013-03-20 19:06:06

+0

即使在每次訪問列表時我都增加了ctr之後,問題仍在發生。現在,問題是你描述應該不會發生。但異常仍然出現...即時給予修改後的代碼上面 – MoDrags 2013-03-21 05:46:14

0

當您分析您通過追加Environment.NewLine

分開行,你就拆逗號「」。 考慮以下2行:

"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字符串,可以先通過新行分開,然後分別由「」:

var lines = richTextBox.Text.Split(Environment.NewLine) 
stringList = new List<string>(); 
foreach (var l in lines) 
    stringList.AddRange(l.Split(",")); 
+0

這可能是問題。你可以提出一個出路嗎? – MoDrags 2013-03-20 06:19:24

+0

我添加了一個示例代碼,它會爲每個值生成一個stringList。 – TiMoch 2013-03-20 12:12:36