/// <summary>
        /// Get one CAN message from the receive queue, RKSCANOpen(...) must have
        ///  been called before. Returns TRUE on success.
        /// </summary>
        /// <returns></returns>
        public virtual CanMessage RKSCANRx()
        {
            NativeCanEntryPoints.can_msg_t pMsg = new NativeCanEntryPoints.can_msg_t();
            var result = Procedure <NativeCanEntryPoints.RKSCANRx>(NativeCanEntryPoints._RKSCANRx)(ref pMsg);

            if (!result)
            {
                throw new Exception();
            }

            var canMessage = new CanMessage
            {
                byType      = pMsg.byType,
                dwTimeStamp = pMsg.dwTimeStamp,
                byError     = pMsg.uFrm.sErr.byError,
                dwID        = pMsg.uFrm.sData.dwID,
                byDLC       = pMsg.uFrm.sData.byDLC,
                abyData     = new byte[]
                {
                    pMsg.uFrm.sData.abyData0,
                    pMsg.uFrm.sData.abyData1,
                    pMsg.uFrm.sData.abyData2,
                    pMsg.uFrm.sData.abyData3,
                    pMsg.uFrm.sData.abyData4,
                    pMsg.uFrm.sData.abyData5,
                    pMsg.uFrm.sData.abyData6,
                    pMsg.uFrm.sData.abyData7,
                }
            };

            return(canMessage);
        }
        /// <summary>
        /// Add one CAN message to the send queue, RKSCANOpen(...) must have
        ///  been called before. Returns TRUE on success.
        /// </summary>
        /// <returns></returns>
        public virtual bool RKSCANTx(CanMessage canMessage)
        {
            NativeCanEntryPoints.can_msg_t pMsg = new NativeCanEntryPoints.can_msg_t();

            pMsg.byType              = canMessage.byType;
            pMsg.dwTimeStamp         = canMessage.dwTimeStamp;
            pMsg.uFrm.sData.dwID     = canMessage.dwID;
            pMsg.uFrm.sData.byDLC    = canMessage.byDLC;
            pMsg.uFrm.sData.abyData0 = canMessage.abyData[0];
            pMsg.uFrm.sData.abyData1 = canMessage.abyData[1];
            pMsg.uFrm.sData.abyData2 = canMessage.abyData[2];
            pMsg.uFrm.sData.abyData3 = canMessage.abyData[3];
            pMsg.uFrm.sData.abyData4 = canMessage.abyData[4];
            pMsg.uFrm.sData.abyData5 = canMessage.abyData[5];
            pMsg.uFrm.sData.abyData6 = canMessage.abyData[6];
            pMsg.uFrm.sData.abyData7 = canMessage.abyData[7];

            return(Procedure <NativeCanEntryPoints.RKSCANTx>(NativeCanEntryPoints._RKSCANTx)(ref pMsg));
        }