我的代码是这样的;
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获取响应。然后将该响应写入文本框。
问题是:它有效地运作了一段时间。我继续更改跟踪栏值。过了一会儿,我在这篇文章的标题中收到了异常消息。
我无法理解错误。任何人都可以弄清楚发生了什么?感谢
答案 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;