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 예외 : 인덱스 배열의 범위 밖에 있었다.
문제점이 무엇인지 알 수 없습니다. 당신은 그것을보고 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까? 나는 전자 공학 전공이므로 프로그래밍에 대한 나의 생각은 미미합니다.
** **는 Read()의 반환 값을 무시하지 마십시오. 그것은 당신이 바라는 바가 아니며, 그것은 더 적습니다. 모두 가져올 때까지 바이트 처리를 기다려야합니다. –