/// <summary> /// 分发响应 /// </summary> /// <param name="cmdId">响应报文命令ID</param> /// <param name="payload">响应负载</param> /// <param name="length">响应负载长度</param> private void dispatchResponse(enCmd cmdId, byte[] payload, byte length) { eRC rc = (eRC)payload[0]; m_u8RxDataLen = (byte)(length - 1); Array.Copy(payload, 1, m_u8aRxData, 0, m_u8RxDataLen); // 检查接收到的命令id是否与请求的id相同 if (cmdId == m_ReqCmdId) { if (m_evReplyArrived != null) { // call the callback m_evReplyArrived(cmdId, rc, m_u8aRxData, m_u8RxDataLen); // reset m_ReqCmdId = enCmd.CMDID_END; // Kous: 注销事件处理函数的方式可能存在问题 m_evReplyArrived = null; // Kous: 清空接收数据缓存 Array.Clear(m_u8aRxData, 0, m_u8RxDataLen); m_u8RxDataLen = 0; } else { CommStackLog.RecordErr(enLogLayer.eSerial, "m_evReplyArrived=null"); } } else { CommStackLog.RecordErr(enLogLayer.eSerial, "cmdId=" + cmdId.ToString() + " m_ReqCmdId=" + m_ReqCmdId.ToString()); } }
/// <summary> /// 发送请求去报文 /// </summary> /// <param name="cmdId">输出报文的命令ID</param> /// <param name="isAck">输出报文是否为响应报文</param> /// <param name="shouldBeAcked">输出报文是否需要响应</param> /// <param name="payload">输出报文的负载</param> /// <param name="length">输出报文的负载长度</param> /// <param name="replyCb">响应回调函数</param> /// <param name="bRetry">是否为重发报文</param> /// <returns>错误码</returns> private enErrCode sendRequestNoCheck(enCmd cmdId, bool isAck, bool shouldBeAcked, byte[] payload, byte length, DlgtReply replyCb, bool bRetry = false) { byte control = 0; // register reply callback m_ReqCmdId = cmdId; m_evReplyArrived = replyCb; // create the control byte if (isAck) { control |= FLAG_ACK; } else { control |= FLAG_DATA; } if (shouldBeAcked) { control |= FLAG_ACKNOWLEDGED; } else { control |= FLAG_UNACKNOWLEDGED; } lock (m_hdlcore) { // send the frame over serial if (bRetry) { m_u8TxPacketId--; } if (!output1Frame(control, (byte)cmdId, m_u8TxPacketId, length, payload)) { return(enErrCode.ERR_INVALID_PARAM); } // increment the txPacketId m_u8TxPacketId++; } return(enErrCode.ERR_NONE); }
/// <summary> /// 发送请求去报文 /// </summary> /// <param name="cmdId">输出报文的命令ID</param> /// <param name="isAck">输出报文是否为响应报文</param> /// <param name="payload">输出报文的负载</param> /// <param name="length">输出报文的负载长度</param> /// <param name="replyCb">响应回调函数</param> /// <param name="bRetry">是否为重发报文</param> /// <returns>错误码</returns> public enErrCode SendRequest(enCmd cmdId, bool isAck, byte[] payload, byte length, DlgtReply replyCb, bool bRetry = false) { // abort if not connected if (m_SerStatus != enSerStatus.SER_ST_CONNECTED) { return(enErrCode.ERR_NOT_CONNECTED); } // send the request return(sendRequestNoCheck(cmdId, isAck, !isAck, payload, length, replyCb, bRetry)); }