[英]Serial Communication with Arduino in C#
我反复读取我使用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次)执行所需的任务(读取串行端口并显示五个Values []),然后出现异常,这会使程序崩溃。 异常指向代码中的这一行。
int value1 = data[0+i*2];
调试器说类似“确保数据索引不为负,最大索引小于列表大小的索引等”之类的内容。 控制台窗口中显示以下异常:
未处理的异常:System.IndexOutOfRange异常:索引超出数组的范围。
我不知道问题是什么。 您能看看一下,告诉我我做错了什么吗? 我是电子专业的学生,所以我的编程想法很简单。
您需要检查n
始终为11。有时它返回的值可能小于11,在这种情况下,您将不需要读取10个字节。 您将需要缓冲它们并再次调用read,直到获得所有10个。
我还建议您检查serialPort1.Read(data, 0, data.Length);
的返回值serialPort1.Read(data, 0, data.Length);
因为它返回实际读取的字节数,而不是您要求读取的字节数。
在此处查看文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.