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); }
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); }
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); }
// 发送单帧或者第一帧 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); } }
private void InitFramesToSend(List <byte> appData) { FramesToSend = DcmTpProtocalISO15765Packer.Pack(appData); }