Ejemplo n.º 1
0
        /// <summary>
        ///  给检测板写开始检测命令,并解析检测板回复的应答数据帧
        /// </summary>
        /// <param name="obis">OBIS码</param>
        /// <param name="parameter">obis参数,若obis参数为空,传入""或string.Empty</param>
        public WriteResult Write(string obis, string parameter)
        {
            byte[] startTestCommand = GetCommand(obis, true, parameter);
            byte[] recvData;

            bool   wrongFrameFlag = true;
            string str            = string.Empty;

            while (wrongFrameFlag)
            {
                try
                {
                    //将检测命令发给检测板,并等待检测板回复应答结果
                    recvData = WriteCommand(startTestCommand, timeoutValue);
                }
                catch (CommunicationException ex)
                {
                    throw new CommunicationException(ex.Message);
                }

                //以下是对检测板回复应答帧的解析 正确应答:Success,异常应答:STX (ERR_Code) ETX BCC
                int index = Array.IndexOf(recvData, (byte)0x06);

                //正确应答 ACK
                if (index != -1)
                {
                    return(new WriteResult(true));
                }

                try
                {
                    str = ParseReply(recvData);
                }
                catch (CommunicationException)  //错误帧
                {
                    wrongFrameFlag = true;
                    continue;
                }

                //错误帧,e.g. 02 28 30 29 03 32,虽然是完整帧,但既不是ACK 也不是异常应答(STX (ERR_Code) ETX BCC)
                if (!(str.Contains("ERR") && str.Length == 6)) //错误帧
                {
                    wrongFrameFlag = true;
                    continue;
                    //throw new CommunicationException(Resources.IncorrectResponse);
                }
            }
            //异常应答完整数据帧
            WriteError error = new WriteError();

            error.ErrorCode = ParseExceptionResponse(str);

            return(new WriteResult(false, error));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 读取检测结果
        /// </summary>
        /// <param name="obis">OBIS码</param>
        /// <param name="parameter">OBIS参数</param>
        /// <param name="testResult">括号里面的检测结果或者错误码</param>
        /// <returns>是否检测成功</returns>
        public bool TryRead(string obis, string parameter, out ReadResult testResult)
        {
            //组帧
            byte[] readResultCommand = GetCommand(obis, false, parameter);

            //发帧
            byte[] recvData = WriteCommand(readResultCommand, timeoutValue);

            //解析帧,将括号里的内容读出来
            string readResult = ParseReply(recvData);

            if (readResult.Contains("ERR") && readResult.Length == 6)
            {
                WriteError error = new WriteError();
                error.ErrorCode = ParseExceptionResponse(readResult);
                testResult      = new ReadResult(false, error);

                return(false);
            }
            testResult = new ReadResult(true, readResult);
            return(true);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 读取检测结果
        /// </summary>
        /// <param name="obis">OBIS码</param>
        /// <param name="parameter">OBIS参数</param>
        /// <returns>检测板返回结果</returns>
        public ReadResult Read(string obis, string parameter)
        {
            //组帧
            byte[] readResultCommand = GetCommand(obis, false, parameter);
            string testResult        = string.Empty;

            int i = 0;

            for (i = 0; i < retransmissionCount; i++)
            {
                //发帧
                byte[] recvData = WriteCommand(readResultCommand, timeoutValue);

                try
                {
                    //解析帧,将括号里的内容读出来
                    testResult = ParseReply(recvData);
                }
                catch (CommunicationException) //错误帧,重传
                {
                    continue;
                }
                break;
            }
            if (i == retransmissionCount)
            {
                throw new CommunicationException(Resources.IncorrectResponse);
            }

            if (testResult.Contains("ERR") && testResult.Length == 6)
            {
                WriteError error = new WriteError();
                error.ErrorCode = ParseExceptionResponse(testResult);

                return(new ReadResult(false, error));
            }
            return(new ReadResult(true, testResult));
        }
Ejemplo n.º 4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="success"></param>
 /// <param name="error"></param>
 /// <param name="data"></param>
 public ReadResult(bool success, WriteError error, string data)
 {
     Success = success;
     Error   = error;
     Data    = data;
 }
Ejemplo n.º 5
0
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="success"></param>
 /// <param name="error"></param>
 public ReadResult(bool success, WriteError error)
 {
     Success = success;
     Error   = error;
 }