public void Start() { IsStart = true; reTryCount = 0; ReceiveStage = YmodemReceiveStage.WaitForFileInfo; SendStage = YmodemSendStage.WaitReceiveRequestFileInfo; TransThread = new Thread(new ThreadStart(TransThreadHandler)); TransThread.IsBackground = true; TransThread.Name = "YmodemTransThread"; TransThread.Start(); if (ymodemInfo.TransMode == TransmitMode.Receive) { if (StartReceive != null) { StartReceive(ymodemInfo, null); } } }
void SendHandler() { YmodemMessage msg; if (msgQueue.Count > 0) { msg = msgQueue.Dequeue(); if (msg != null) { reTryCount = 0; switch (msg.MessageType) { case YmodemMessageType.NAK: if (SendStage == YmodemSendStage.WaitReceiveAnswerEndTransmit) { SendEOT(); } else { // 通知重发 if (ReSendPacket != null) { ReSendPacket(ymodemInfo, null); } } break; case YmodemMessageType.KEY_C: if (SendStage == YmodemSendStage.WaitReceiveRequestFileInfo) { // 通知发头一包CRC if (StartSend != null) { StartSend(ymodemInfo, null); } } else if (SendStage == YmodemSendStage.WaitReceiveRequestFirstPacket) //等待第一包 { SendStage = YmodemSendStage.PacketSending; // 通知发下一包 if (SendNextPacket != null) { SendNextPacket(ymodemInfo, null); } } else if (SendStage == YmodemSendStage.WaitReceiveNextFileReq) //接收方请求下一个文件 { SendNoFilesToSend(); } break; case YmodemMessageType.ACK: if (SendStage == YmodemSendStage.WaitReceiveRequestFileInfo) { SendStage = YmodemSendStage.WaitReceiveRequestFirstPacket; //等待接收方请求第一包数据 } else if (SendStage == YmodemSendStage.PacketSending) { // 通知发下一包 if (SendNextPacket != null) { SendNextPacket(ymodemInfo, null); } } else if (SendStage == YmodemSendStage.WaitReceiveAnswerEndTransmit) { SendStage = YmodemSendStage.WaitReceiveNextFileReq; //等待接收方请求下一个文件 } break; case YmodemMessageType.CAN: // 通知中止 if (AbortTransmit != null) { AbortTransmit(ymodemInfo, null); } break; default: break; } } } else { if (waitReceiveEvent.WaitOne(3000)) { waitReceiveEvent.Reset(); } else { reTryCount++; if (reTryCount > RetryMax) { IsStart = false; //通知接收超时 if (TransmitTimeOut != null) { TransmitTimeOut(ymodemInfo, null); } } } } }
private void SendEOT() { SendFrameToUart(EOT); SendStage = YmodemSendStage.WaitReceiveAnswerEndTransmit; }