Я неоднократно читаю последовательный порт, который я создал с помощью 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 Исключение: Индекс находился вне границ массива.
Я не знаю, в чем проблема. Можете ли вы взглянуть на него и сказать мне, что я делаю неправильно. Я майор электроники, поэтому моя идея программирования минимальна.
** Никогда ** игнорируйте возвращаемое значение Read(). Это не то, на что вы надеетесь, это будет меньше. Вам придется подождать обработки байтов, пока не получите все из них. –