/// <summary>Записать и считать пакет</summary> /// <param name="channel"></param> /// <param name="sendBuf"></param> /// <param name="readBuf"></param> /// <returns></returns> OperationResult WriteReadCheckPrivate(IIODriverClient channel, byte[] sendBuf, out byte[] readPacket) { readPacket = null; OperationResult result = WaitRequest(channel); if (!result.IsGood) { return(result); } try { channel.DiscardInBuffer(); channel.DiscardOutBuffer(); channel.Write(sendBuf, 0, sendBuf.Length); List <byte> read = new List <byte>(); bool isRead = true; do { int d = channel.ReadByte(); if (d < 0) { isRead = false; } else { byte b = (byte)d; read.Add(b); if (b == Codes.BYTE_END && read.Count > 1) { isRead = false; } } } while (isRead); byte[] readBuf = decodePacket(read.ToArray()); channel.DiscardInBuffer(); channel.DiscardOutBuffer(); if (readBuf.Length < 9 || readBuf[0] != Codes.BYTE_END || readBuf[readBuf.Length - 1] != Codes.BYTE_END) { return(new OperationResult(Quality.Bad, SR.MACHINE_ERROR)); } if (sendBuf[2] != readBuf[4] || sendBuf[3] != readBuf[5]) { return(new OperationResult(Quality.Bad, SR.NOT_COMPLIANT_ADDRESS)); } if (sendBuf[11] != readBuf[7] || sendBuf[12] != readBuf[8]) { return(new OperationResult(Quality.Bad, SR.NOT_COMPLIANT_FUNCTION)); } var crc = CRC.getCRC(readBuf, 2); if (crc != readBuf[readBuf.Length - 2]) { return(new OperationResult(Quality.BadCRC, SR.CRC)); } //сообщение об ошибке if ((readBuf[6] & 0xF0) == Codes.BYTE_ERR) { return(new OperationResult(Quality.Bad, ErrorsDescription.GetError(readBuf[9]))); } if ((readBuf[6] & 0xF0) != Codes.BYTE_SERV_ANSWER) { return(new OperationResult(Quality.Bad, SR.BLOCK_DAMAGED)); } int packetLength = readBuf.Length - 11; if ((readBuf[6] & 0x0F) != (byte)packetLength) { return(new OperationResult(Quality.Bad, SR.PACKET_LENGTH_ABNORMAL)); } readPacket = new byte[packetLength]; int i = 0; while (i < packetLength) { readPacket[i] = readBuf[i + 9]; i++; } return(result); } catch (Exception e) { result.Quality = e.ToQuality(); result.ErrorMsg = e.GetFullMessage(); } finally { //sw.Restart(); } return(result); }