Example #1
0
        /// <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);
        }