【问题标题】:Serial Communication with Arduino in C#在 C# 中与 Arduino 进行串行通信
【发布时间】:2013-05-23 00:40:14
【问题描述】:

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

我的问题是,当我运行代码时,它会执行所需的任务(读取串行端口并显示五个 Values[] )几次(5,6 次),然后我得到一个异常,这使我的程序崩溃. 异常指向代码中的这一行。

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

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

未处理的异常:System.IndexOutOfRange 异常:索引超出了数组的范围。

我不知道问题是什么。 你能看看它并告诉我我做错了什么。我是电子专业的,所以我对编程的想法很少。

【问题讨论】:

  • 从不忽略 Read() 的返回值。这不是你希望的那样,它更少。您必须等待处理字节,直到获得所有字节。

标签: c# serial-port arduino


【解决方案1】:

您需要检查n 是否始终为 11。它有时可能返回小于 11,在这种情况下您将没有 10 个字节可读取。您需要缓冲它们并再次调用 read,直到获得全部 10 个。

我还建议您检查serialPort1.Read(data, 0, data.Length); 的返回值,因为它返回的是它实际读取的字节数,而不是您要求它读取的字节数。

请参阅文档here

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多