Пример #1
0
        private ReceiveResult ReceiveSFOrFF(int hostId, List <byte[]> frames)
        {
            Message message = ReceiveMessage();

            if (message != null)
            {
                byte pci = message.Data[0];
                Debug.Assert(DcmTpProtocalISO15765Packer.IsSingleFrame(pci) ||
                             DcmTpProtocalISO15765Packer.IsFirstFrame(pci), "DcmTpProtocalISO15765Receiver" +
                             "->ReceiveSFOrFF: Not Single Frame Or First Frame");

                frames.Clear();
                frames.Add(message.Data);
                if (DcmTpProtocalISO15765Packer.IsSingleFrame(pci))
                {
                    return(ReceiveSuccess);
                }
                else if (DcmTpProtocalISO15765Packer.IsFirstFrame(pci))
                {
                    HostId = hostId;
                    int totalLen = (((message.Data[0] & 0x0f) << 8) + message.Data[1]);
                    LeftConsecutiveFrameCount = (totalLen - 6) / 7
                                                + ((((totalLen - 6) % 7) != 0) ? 1 : 0);
                    Frames    = frames;
                    WorkState = WorkStateEnum.SendFlowControlFrame;

                    //立即发送流控制帧
                    SendFlowControl();
                }
            }
            return(ReceiveResult.Working);
        }
Пример #2
0
        private bool Receive()
        {
            var  result = receiver.Receive(CanId, FramesReceived);
            bool ret    = false;

            switch (result)
            {
            case DcmTpProtocalISO15765Receiver.ReceiveResult.Ok:
                DcmTpHandleResult = DcmTpHandleResult.OK;
                // 解包数据
                AppDataReceived = DcmTpProtocalISO15765Packer.Unpack(FramesReceived);
                Reset();
                ret = true;
                break;

            case DcmTpProtocalISO15765Receiver.ReceiveResult.Working:
                ret = false;
                break;

            case DcmTpProtocalISO15765Receiver.ReceiveResult.Fail:
                DcmTpHandleResult = DcmTpHandleResult.FailWithReceive;
                Reset();
                ret = true;
                break;

            default:
                throw new InvalidOperationException("DcmTpProtocalISO15765.Send: Unknown work " +
                                                    "state -> " + WorkState.ToString());
            }

            if (!ret)
            {
                // 检测接收超时
                if (ReceiveTimeoutCheck && (stopwatch.ElapsedMilliseconds >= ReceiveTimeout))
                {
                    DcmTpHandleResult = DcmTpHandleResult.FailWithReceiveTimeout;
                    Reset();
                    return(true);
                }
            }

            return(ret);
        }
Пример #3
0
        public bool ReceiveFlowControlFrame(ref byte flowState, ref byte blockSize, ref byte stMin)
        {
            Message message = ReceiveMessage();

            if (message != null)
            {
                if (DcmTpProtocalISO15765Packer.IsFlowControlFrame(message.Data[0]))
                {
                    flowState = (byte)(message.Data[0] & 0x0f);
                    blockSize = message.Data[1];
                    stMin     = message.Data[2];
                    return(true);
                }
                else
                {
                    Debug.Assert(false, "DcmTpProtocalISO15765Receiver: Filter setting error");
                }
            }
            return(false);
        }
Пример #4
0
        // 发送单帧或者第一帧
        private SendResult SendSFOrFF(int canId, List <byte[]> frames)
        {
            Debug.Assert(frames.Count > 0, "DcmTpProtocalISO15765Sender: Invalid SFOrFF");

            byte pci = frames[0][0];

            Debug.Assert(DcmTpProtocalISO15765Packer.IsSingleFrame(pci) ||
                         DcmTpProtocalISO15765Packer.IsFirstFrame(pci));
            var result = SendMessage(canId, frames[0]);

            if (DcmTpProtocalISO15765Packer.IsSingleFrame(pci)) // 单帧
            {
                Reset();
                return(result ? SendResult.Ok : SendResult.Fail);
            }
            else if (DcmTpProtocalISO15765Packer.IsFirstFrame(pci)) //多帧
            {
                if (!result)
                {
                    return(SendFailed);
                }
                else
                {
                    // 进入等待流控制帧状态
                    CanId      = canId;
                    Frames     = frames;
                    WorkState  = WorkStateEnum.WaitFlowControlFrame;
                    FrameIndex = 1;
                    return(SendResult.Working);
                }
            }
            else
            {
                return(SendFailed);
            }
        }
Пример #5
0
 private void InitFramesToSend(List <byte> appData)
 {
     FramesToSend = DcmTpProtocalISO15765Packer.Pack(appData);
 }