/// <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)); }
/// <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); }
/// <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)); }
/// <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; }
/// <summary> /// 初始化 /// </summary> /// <param name="success"></param> /// <param name="error"></param> public ReadResult(bool success, WriteError error) { Success = success; Error = error; }