问题描述
privatevoidserialPort1_DataReceived(objectsender,SerialDataReceivedEventArgse){if(checkBox1.Checked==true){intbytesize=serialPort1.BytesToRead;byte[]buffer=newbyte[bytesize];serialPort1.Read(buffer,0,bytesize);stringreadString=ByteArrayToHexString(buffer);stringcopstr=readString.TrimEnd('');string[]sarray=copstr.Split('');intresult=string.Compare("A7",sarray[1]);if(result==0){stringa_8="0FA83031037A4E9EF0FF";serialPort1.WriteLine(a_8);}this.Invoke(updateText,newstring[]{readString});}else{stringreadString=serialPort1.ReadExisting();this.Invoke(updateText,newstring[]{readString});}}运行的时候总是说sarray[1]数组索引出错,我设置断点,调试的时候没事,一运行的时候bytesize变量就变为0导致后面的数组索引出错
解决方案
解决方案二:
断点调试的时候看看数组里面的数据。string[]sarray=copstr.Split('');
解决方案三:
bytesize至少要等于2的时候才能使用sarray[1]intbytesize=serialPort1.BytesToRead;if(bytesize==0){return;}
解决方案四:
2楼+1
解决方案五:
通讯的基础是数据帧或叫数据包,你首先要保证的的数据的完整性,但数据传输是连续的,所以往往需要一个通讯协议,例如02/03,分别表示数据包的开始/结束,这样,你接收到数据才能正确还原出一个数据包。如果简单一点的话,那可以Sleep(1000)//适当加延时,保证对方的响应数据都收到后才处理。具体到你的代码里面,可以在serialPort1_DataReceived事件里面第一时间先等待一下,然后再读取数据。
解决方案六:
引用1楼zongbao516的回复:
断点调试的时候看看数组里面的数据。string[]sarray=copstr.Split('');
断点调试的时候数据没错的,所有变量都是正常,sarray数组里的确有数据,但是一运行就会提示数组索引出错,我查看变量值发现bytesize是0
解决方案七:
intbytesize=serialPort1.BytesToRead;bytesize>0才继续往下运行!或者设置SerialPort.ReceivedBytesThreshold
解决方案八:
我在serialPort1_DataReceived延时了再读取数据还是不行,几天都没解决到问题啊....求高人指点!
解决方案九:
我在serialPort1_DataReceived延时了再读取数据还是不行,几天都没解决到问题啊....求高人指点!