Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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);
                        }
                    }
                }
            }
        }
Пример #3
0
 private void SendEOT()
 {
     SendFrameToUart(EOT);
     SendStage = YmodemSendStage.WaitReceiveAnswerEndTransmit;
 }