2012-04-14 4 views
0

나는 다음과 같은 코드가 있습니다C#을, 인덱스 배열의 범위를 벗어난

void serialport_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     string serialData = serialport.ReadExisting().Replace("/n", ""); 
     string[] splitSerialData = serialData.Split(new Char[] {','}); //Split up the data 

     this.Invoke(new Action(delegate() 
      { 
       this.temperatureLabel.Text = splitSerialData[0]; 
      })); 
    } 

을 그리고 그것은 잘 작동하지만 내가 할 때

void serialport_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     string serialData = serialport.ReadExisting().Replace("/n", ""); 
     string[] splitSerialData = serialData.Split(new Char[] {','}); //Split up the data 

     this.Invoke(new Action(delegate() 
      { 
       this.temperatureLabel.Text = splitSerialData[0]; 
       this.lightLevelLabel.Text = splitSerialData[1]; 
      })); 
    } 

그것은 "일을 말한다하지 않습니다 인덱스 배열의 범위를 벗어난 것입니다".

+3

'/ n'이 (가)'\ n '이 아닌가요? – dasblinkenlight

+1

문자열에 쉼표가 있습니까? 힌트 : 그렇지 않습니다. – Ryan

+0

splitSerialData의 문자열 수를 확인해야합니다. splitSerialData.Length> 2를 사용합니다. – Casperah

답변

4

serialData에 쉼표가 없으므로이 오류가 발생합니다. 결과 배열은 하나의 요소를 포함하고 표현식 splitSerialData[1]은 IndexOutOfRangeException을 발생시킵니다.

+0

이것은 내 Arduino가 프로그램에 보내는 것입니다 : Serial.print (temperatureC); Serial.print (","); Serial.print (lightLux); Serial.print ("/ n"); –

+0

데이터는 다음과 같습니다 : 16.37,180.29/n –

+0

@Thomas는 프로그램을 디버깅합니다. 모든 문자가 수신되기 전에 이벤트가 발생하는 것 같습니다 * 모든 것이 도착할 때까지 데이터를 캐싱 한 다음 처리하는 방법이 필요합니다. – phoog

3

즉, split은 정확히 하나의 요소, 즉 전체 문자열을 반환합니다. 인덱스 1에는 배열 요소가 없으므로

splitSerialData[1] 

IndexOutOfBounds 예외를 발생시킵니다.

이것은 차례로 전달한 문자열에 쉼표 ',' 문자가 없다는 것을 의미합니다.

관련 문제