"索引超出了数组的范围"使用ToString线

时间:2014-03-11 20:47:47

标签: c# exception serial-port tostring

我的代码是这样的;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace SerialTest2
{
    public partial class Form1 : Form
    {
        int  my_Value, SerialConverted_IntValue;
        public Form1()
        {
            InitializeComponent();
        }
        SerialPort mySerial = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
        private void Start_Button_Click(object sender, EventArgs e)
        {
            if (mySerial.IsOpen == false)
            {
                mySerial.Open();
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            mySerial.Handshake = Handshake.None;
            mySerial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        }
        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            if (mySerial.IsOpen)
            {
                int bytes = mySerial.BytesToRead;
                byte[] byte_buffer = new byte[bytes];
                mySerial.Read(byte_buffer, 0, bytes);
                SerialConverted_IntValue = byte_buffer[0];// Error shows this line
            }
        }



        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            my_Value = trackBar1.Value;
            textBox1.Text = my_Value.ToString();
            byte[] buffer_2_send = new byte[1];

            byte[] data_2_send = BitConverter.GetBytes(trackBar1.Value);
            buffer_2_send[0] = data_2_send[0];
            if (mySerial.IsOpen)
            {
                mySerial.Write(buffer_2_send, 0, buffer_2_send.Length);
            }
            Thread.Sleep(20);

            textBox2.Text = SerialConverted_IntValue.ToString();
        }
    }
}

此代码的作用只是将trackbar值发送到serialport并从serialport获取响应。然后将该响应写入文本框。

问题是:它有效地运作了一段时间。我继续更改跟踪栏值。过了一会儿,我在这篇文章的标题中收到了异常消息。

我无法理解错误。任何人都可以弄清楚发生了什么?感谢

3 个答案:

答案 0 :(得分:2)

如果此行返回零

,则可能发生这种情况
 int bytes = mySerial.BytesToRead

使用

保护您的阅读
if(bytes > 0)
    SerialConverted_IntValue = byte_buffer[0];

答案 1 :(得分:1)

这是一个正常的事故,BytesToRead属性值可以为零。虽然这听起来很奇怪,但是你会发现收到数据时会发出一个名为“收到数据”的事件,该事件也会因其他原因而触发。 e.EventType属性告诉您原因。

如果您收到二进制数据,那么偶尔其中一个字节的值为0x1a,Ctrl + Z的ASCII代码是文件结束控制字符的旧值。使用e.EventType = SerialData.Eof报告。当您索引空数组时,Kaboom在您的代码中。是否报告Eof通常是可以在串行端口上配置的东西,因为在.NET包装器上忽略了一些奇怪的原因。

检查e.EventType或BytesToRead值是解决方法。或者更好的情况是,当BytesToRead大于1时,您的代码也会出现错误行为。您将完全忽略您收到的额外字节,即通常相当有害的数据丢失:

   if (e.EventType == SerialData.Chars) {
        SerialConverted_IntValue = mySerial.BaseStream.ReadByte();
   }

答案 2 :(得分:0)

似乎问题在于此行中要读取的字节数为0

int bytes = mySerial.BytesToRead;

所以当你尝试读取长度为0的数组的第一个字节时,你会得到这个错误

SerialConverted_IntValue = byte_buffer[0];

如果bytes为零,则从函数返回:

if(bytes == 0)
    return;