Exemplo n.º 1
0
        /// <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());
            }
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
 /// <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));
 }