当前位置:编程学习 > C#/ASP.NET >>

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事件里面第一时间先等待一下,然后再读取数据。 --------------------编程问答--------------------
引用 1 楼 zongbao516 的回复:
断点调试的时候看看数组里面的数据。string[] sarray = copstr.Split(' ');


断点调试的时候数据没错的,所有变量都是正常,sarray数组里的确有数据,但是一运行就会提示数组索引出错,我查看变量值发现bytesize是0 --------------------编程问答--------------------  int bytesize = serialPort1.BytesToRead;

bytesize>0才继续往下运行!

或者设置SerialPort.ReceivedBytesThreshold --------------------编程问答-------------------- 我在serialPort1_DataReceived延时了再读取数据还是不行,几天都没解决到问题啊....求高人指点!
--------------------编程问答-------------------- 我在serialPort1_DataReceived延时了再读取数据还是不行,几天都没解决到问题啊....求高人指点!
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,