最近写一个上位机遇到套接字读取数据的时候线程停止。
上读取代码:

        public static bool ReadAirCompressor(string address,  out int Data)
        {
            bool result=false;
            address = DataRead.ReadAddress; //空压机地址
            int  cnt = 43;                       //读取数据个数
            result = ComCompressor(address, 0x01,0x10, cnt);
            if (result == true)
            {
                Data = 1;
                return true;
            }
            else
            {
                Data = 0;
                return false;
            }
        }
        public static bool ComCompressor(string ipaddress, int address, int state, int DataCnt )
        {
            byte[] Mdata = new byte[8];
            dataCnt = DataCnt;//先声明读数据长度
            DateTime sendtime = DateTime.Now;
           // SendData =Convert.ToString( sendtime)+">>"+ipaddress+address+dataCnt; //发送到显示

            Mdata[0] = Convert.ToByte(address);     //modbus站号
            Mdata[1] = 0x03;                        //功能码 写多个寄存器
            Mdata[2] = 0x00;
            Mdata[3] = 0x30;
            //Mdata[2] = Convert.ToByte(state >> 8);  //起始地址高位
            //Mdata[3] = Convert.ToByte(state & 0xFF);//起始地址地位
            Mdata[4] = 0x00;                        //寄存器总数高位
            Mdata[5] = 0x02;                        //寄存器总数低位 2
            Mdata[6] = 0xC4;                        //CRC校验高
            Mdata[7] = 0x04;                        //CRC校验低


            //连接套接字
            Socket sokClient = null;//负责与服务端通信的套接字
            sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建 ip对象

            IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.0.110"),8001);
            //连接 服务端监听套接字
            sokClient.Connect(endpoint);
            sokClient.Send(Mdata);
            byte[] msgArr = new byte[9 * 1];//接收到的消息的缓冲区
            int length = 0;
            //接收服务端发送来的消息数据 thread
            Thread.Sleep(100);
            SendData = "";
            if(sokClient.Available>0)
            {
                length = sokClient.Receive(msgArr);//Receive这里阻断线程
            }
            else
            {
                sokClient.Close();
            }
           
           int[] d = new int[msgArr.Length];
            string[] hex=new string[msgArr.Length];
            for (int i=0;i<msgArr.Length;i++)
            {
                d[i] = Convert.ToInt32(msgArr[i]);
                hex[i] = d[i].ToString("X2");
            }

            return false;
        }

如上代码,无缘无故线程停止。
查问题,逐句运行。发现是读取数据的时候出错。
所以增加一个判断,在有消息的时候进行读取。
但是发现一直收不到消息。
检测发现报文发送错误
修改正确的报文后bug解决。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐