C# 串口通信datareceive事件的问题
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){
if (checkBox1.Checked == true)
{
int bytesize = serialPort1.BytesToRead;
byte[] buffer = new byte[bytesize];
serialPort1.Read(buffer, 0, bytesize);
string readString = ByteArrayToHexString(buffer);
string copstr = readString.TrimEnd(' ');
string[] sarray = copstr.Split(' ');
int result = string.Compare("A7", sarray[1]);
if (result == 0)
{
string a_8 = "0F A8 30 31 03 7A 4E 9E F0 FF";
serialPort1.WriteLine(a_8);
}
this.Invoke(updateText, new string[] { readString });
}
else
{
string readString = serialPort1.ReadExisting();
this.Invoke(updateText, new string[] { readString });
}
}
运行的时候总是说 sarray[1]数组索引出错,我设置断点,调试的时候没事,一运行的时候bytesize变量就变为0导致后面的数组索引出错 --------------------编程问答-------------------- 断点调试的时候看看数组里面的数据。string[] sarray = copstr.Split(' '); --------------------编程问答-------------------- bytesize至少要等于2的时候才能使用sarray[1]
int bytesize = serialPort1.BytesToRead;
if(bytesize==0)
{
return;
} --------------------编程问答-------------------- 2楼+1 --------------------编程问答-------------------- 通讯的基础是数据帧或叫数据包,你首先要保证的的数据的完整性,
但数据传输是连续的,所以往往需要一个通讯协议,例如02/03,分别表示数据包的开始/结束,这样,你接收到数据才能正确还原出一个数据包。
如果简单一点的话,那可以Sleep(1000)//适当加延时,保证对方的响应数据都收到后才处理。
具体到你的代码里面,可以在serialPort1_DataReceived事件里面第一时间先等待一下,然后再读取数据。 --------------------编程问答--------------------
断点调试的时候数据没错的,所有变量都是正常,sarray数组里的确有数据,但是一运行就会提示数组索引出错,我查看变量值发现bytesize是0 --------------------编程问答-------------------- int bytesize = serialPort1.BytesToRead;
bytesize>0才继续往下运行!
或者设置SerialPort.ReceivedBytesThreshold --------------------编程问答-------------------- 我在serialPort1_DataReceived延时了再读取数据还是不行,几天都没解决到问题啊....求高人指点!
--------------------编程问答-------------------- 我在serialPort1_DataReceived延时了再读取数据还是不行,几天都没解决到问题啊....求高人指点!
补充:.NET技术 , C#