2013-05-23 6 views
0

C#을 사용하여 만든 직렬 포트를 반복적으로 읽습니다 (쉽습니다).C#의 Arduino와의 시리얼 통신

폼의 시작 버튼을 클릭하고 콘솔에 읽기 값을 쓰고 난 후 직렬 포트를 읽도록 루프를 만들었습니다 (예를 들어 50 밀리 초 지연 후 50 번). 직렬 포트의 10 바이트를 읽습니다.

private void buttonStart_Click(object sender, EventArgs e) 
    { 
     serialPort1.PortName = "COM3"; 
     serialPort1.BaudRate = 115200; 

     serialPort1.Open(); 
     if (serialPort1.IsOpen) 
     { 
      buttonStart.Enabled = false; 
      buttonStop.Enabled = true; 
      //textBox1.ReadOnly = false; 
     } 


     for (int i = 0; i < 50; i++) 
     { 
      string input = "AN\n"; // Analog read command for WildThumper (No problems here) 


      if (!serialPort1.IsOpen) return; 
      serialPort1.Write(input); 

      Application.DoEvents(); 
      System.Threading.Thread.Sleep(50); 

     } 

    } 

마지막 바이트는 '*'로, 내 경우에는 문자열 구분 기호의 끝입니다. 그럼 내가

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     int n = serialPort1.BytesToRead; // gives me n = 11 (the last one is '*' for end of string) 
     byte[] data = new byte[n]; 
     serialPort1.Read(data, 0, data.Length); 
     int[] Values = new int [5]; 


     for(int i = 0;i<5;i++) 
     { 
      int value1 = data[0+i*2]; 
      int value2 = data[1+i*2]; 

      int value = value1 + value2; 
      Values[i] = value; 
     } 
     string RxString = string.Join(" ", Values.Select(i => i.ToString()).ToArray()); 
     Console.WriteLine(RxString + Environment.NewLine); 
    } 

내 문제는 다음 코드 조각으로 5 개 값에 읽기 10 바이트를 결합하는 나는 그것을하지 필요한 작업 (다섯 개 값을 시리얼 포트를 읽고 표시 [코드를 실행할 때 ]) 몇 번 (5,6 번), 그렇다면 프로그램이 다운되는 예외가 생깁니다. 예외가 코드의이 줄을 가리 킵니다. 디버거는 말한다

 int value1 = data[0+i*2]; 

는 같은 "데이터 인덱스는 음수가 있는지 확인이 최대 인덱스가 적은 목록 크기 등 등의 지표이다"라고 다음 예외는 콘솔 화면에 표시되어

처리되지 않은 예외 : System.IndexOutOfRange 예외 : 인덱스 배열의 범위 밖에 있었다.

문제점이 무엇인지 알 수 없습니다. 당신은 그것을보고 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까? 나는 전자 공학 전공이므로 프로그래밍에 대한 나의 생각은 미미합니다.

+0

** **는 Read()의 반환 값을 무시하지 마십시오. 그것은 당신이 바라는 바가 아니며, 그것은 더 적습니다. 모두 가져올 때까지 바이트 처리를 기다려야합니다. –

답변

1

항상 n을 확인해야합니다. 때때로 11 미만을 반환 할 가능성이 있으며,이 경우 11 바이트를 읽을 수 없습니다. 그들을 버퍼링하고 10 개가 모두 나올 때까지 다시 읽어야합니다.

serialPort1.Read(data, 0, data.Length);의 반환 값을 확인하는 것이 좋습니다. 반환 값은 실제로 읽은 바이트 수를 반환하기 때문에 실제로 읽은 바이트 수는 반환하지 않습니다.

docs here을 참조하십시오.