最近写一个上位机遇到套接字读取数据的时候线程停止。
上读取代码:
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解决。