2013-05-23 2 views
0

Я неоднократно читаю последовательный порт, который я создал с помощью C# (что очень просто).Последовательная связь с Arduino в C#

Я создал цикл для чтения последовательного порта (скажем, 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); 

     } 

    } 

Последний байт является «*», который является концом разделителя строк в моем случае. Тогда я объединить чтения 10 байтов в 5 значений по следующей части кода

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,6 раза), то я получаю исключение, которое заставляет мою программу сбой. исключение указывает на эту строку в коде.

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

отладчик говорит, говорит что-то вроде «убедитесь, что данные индекса не является отрицательным, то максимальный показатель меньше, что индекс списка размера и т.д. и т.п.» следующее исключение отображается в окне консоли:

Необработанное исключение: System.IndexOutOfRange Исключение: Индекс находился вне границ массива.

Я не знаю, в чем проблема. Можете ли вы взглянуть на него и сказать мне, что я делаю неправильно. Я майор электроники, поэтому моя идея программирования минимальна.

+0

** Никогда ** игнорируйте возвращаемое значение Read(). Это не то, на что вы надеетесь, это будет меньше. Вам придется подождать обработки байтов, пока не получите все из них. –

ответ

1

Вам необходимо проверить, что n всегда 11. Существует вероятность того, что он иногда возвращает меньше 11, и в этом случае у вас не будет 10 байтов для чтения. Вам нужно будет их буферизировать и снова вызвать чтение, пока не получите все 10 из них.

Я также рекомендую вам проверить возвращаемое значение serialPort1.Read(data, 0, data.Length);, потому что оно возвращает количество фактически прочитанных байтов, а не количество байтов, которое вы просили его прочитать.

См. Документы here.

Смежные вопросы