/// <summary> /// 读取数据的长度 /// </summary> /// <param name="address"></param> /// <param name="length"></param> /// <returns></returns> public byte[] ReadDataFromPLC(int address, int length, int timeOut) { if (!Monitor.TryEnter(_flag)) { throw new Exception("串口正在执行命令,请稍后"); } lock (_flag) { _dataRecv = null; if (null != _port && _port.IsOpen) { var command = PLCCommandFactory.GetReadCommand(address, length); _port.Write(command); Console.WriteLine($"向PLC发送数据"); CommandFactory.PrintBytes(command); } else { throw new Exception("请先打开串口"); } var index = 1; while (index < timeOut) { Thread.Sleep(1); index++; if (null != _dataRecv && _dataRecv.Length > 1) { var newBuffer = new byte[_dataRecv.Length]; Array.Copy(_dataRecv, 0, newBuffer, 0, _dataRecv.Length); //接受到应答数据 Console.WriteLine($"接受到PLC应答数据:{GetHexString(newBuffer)}"); if ((length * 2) + 4 != newBuffer.Length) { throw new Exception("接受到PLC应答数据的长度不对"); } //对接受到的数据进行解析 //if (!PLCCommandFactory.ValidateData(newBuffer)) //{ // throw new Exception("接受到的数据校验失败"); //} var datas = new byte[newBuffer.Length - 4]; Array.Copy(newBuffer, 1, datas, 0, datas.Length); return(HexStrToByteArray(Encoding.ASCII.GetString(datas))); } } throw new Exception("执行命令超时"); } }