C# 在C语言中与Arduino的串行通信#

C# 在C语言中与Arduino的串行通信#,c#,serial-port,arduino,C#,Serial Port,Arduino,我反复阅读我使用C#创建的串行端口(这很简单) 我创建了一个循环来读取串行端口(比如50毫秒延迟后读取50次),并在单击表单上的开始按钮并将读取值写入控制台后读取串行端口的10个字节 private void buttonStart_Click(object sender, EventArgs e) { serialPort1.PortName = "COM3"; serialPort1.BaudRate = 115200; se

我反复阅读我使用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);

        }

    }
调试器会说“确保数据索引不是负数,最大索引小于列表大小的索引等。” 控制台窗口中显示以下异常:

未处理的异常:System.IndexOutOfRange异常:索引超出数组的边界

我不知道是什么问题。
你能看一下,告诉我我做错了什么吗。我是电子专业的学生,所以我对编程的想法很简单。

你需要检查
n
总是11。有时它返回的值可能小于11,在这种情况下,您将没有10个字节可读取。您需要对它们进行缓冲并再次调用read,直到获得所有10个

我还建议您检查
serialPort1.Read(data,0,data.Length)的返回值
请参阅文档。

切勿忽略Read()的返回值。它不是你所希望的,而是更少。您必须等待处理字节,直到获得所有字节。
    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);
     }
     int value1 = data[0+i*2];