初始化上传
This commit is contained in:
101
常用工具集/Utility/SerialDebug/FileTransmit/BinarySend.cs
Normal file
101
常用工具集/Utility/SerialDebug/FileTransmit/BinarySend.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using XMX.FileTransmit;
|
||||
using System.Threading;
|
||||
|
||||
|
||||
namespace XMX.FileTransmit
|
||||
{
|
||||
public class BinarySend : IFileTramsmit, ITransmitUart
|
||||
{
|
||||
private bool IsStart = false;
|
||||
Thread SendThread;
|
||||
|
||||
private int DelayTime = 10;
|
||||
public BinarySend(int delayTime)
|
||||
{
|
||||
DelayTime = delayTime;
|
||||
}
|
||||
|
||||
|
||||
private void SendThreadHandler()
|
||||
{
|
||||
while (IsStart)
|
||||
{
|
||||
if (SendNextPacket != null)
|
||||
{
|
||||
SendNextPacket(this, null);
|
||||
Thread.Sleep(DelayTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region IFileTramsmit <EFBFBD><EFBFBD>Ա
|
||||
|
||||
public event EventHandler StartSend = null;
|
||||
|
||||
public event EventHandler StartReceive = null;
|
||||
|
||||
public event EventHandler SendNextPacket;
|
||||
|
||||
public event EventHandler ReSendPacket = null;
|
||||
|
||||
public event EventHandler AbortTransmit = null;
|
||||
|
||||
public event EventHandler TransmitTimeOut = null;
|
||||
|
||||
public event EventHandler EndOfTransmit = null;
|
||||
|
||||
public event PacketEventHandler ReceivedPacket = null;
|
||||
|
||||
public void SendPacket(PacketEventArgs packet)
|
||||
{
|
||||
if (SendToUartEvent != null)
|
||||
{
|
||||
SendToUartEvent(null, new SendToUartEventArgs(packet.Packet));
|
||||
}
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
IsStart = true;
|
||||
SendThread = new Thread(new ThreadStart(SendThreadHandler));
|
||||
SendThread.IsBackground = true;
|
||||
SendThread.Start();
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
IsStart = false;
|
||||
if (EndOfTransmit!=null)
|
||||
{
|
||||
EndOfTransmit(this, null);
|
||||
}
|
||||
}
|
||||
|
||||
public void Abort()
|
||||
{
|
||||
IsStart = false;
|
||||
if (AbortTransmit!=null)
|
||||
{
|
||||
AbortTransmit(this, null);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ITransmitUart <EFBFBD><EFBFBD>Ա
|
||||
|
||||
public event SendToUartEventHandler SendToUartEvent;
|
||||
|
||||
public void ReceivedFromUart(byte[] data)
|
||||
{
|
||||
Console.WriteLine("<22><><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>账<EFBFBD><E8B4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
84
常用工具集/Utility/SerialDebug/FileTransmit/IFileTramsmit.cs
Normal file
84
常用工具集/Utility/SerialDebug/FileTransmit/IFileTramsmit.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace XMX.FileTransmit
|
||||
{
|
||||
public enum TransmitMode
|
||||
{
|
||||
Receive,
|
||||
Send
|
||||
}
|
||||
|
||||
public delegate void PacketEventHandler(object sender, PacketEventArgs e);
|
||||
|
||||
interface IFileTramsmit:ITransmitUart
|
||||
{
|
||||
|
||||
|
||||
event EventHandler StartSend;
|
||||
event EventHandler StartReceive;
|
||||
event EventHandler SendNextPacket;
|
||||
event EventHandler ReSendPacket;
|
||||
event EventHandler AbortTransmit;
|
||||
event EventHandler TransmitTimeOut;
|
||||
event EventHandler EndOfTransmit;
|
||||
|
||||
event PacketEventHandler ReceivedPacket;
|
||||
|
||||
|
||||
void SendPacket(PacketEventArgs packet);
|
||||
void Start();
|
||||
void Stop();
|
||||
void Abort();
|
||||
|
||||
}
|
||||
|
||||
public class PacketEventArgs : EventArgs
|
||||
{
|
||||
private readonly int _PacketNo;
|
||||
private readonly int _PacketLen;
|
||||
private readonly byte[] _Packet;
|
||||
|
||||
|
||||
public PacketEventArgs(int packetNo, byte[] packet)
|
||||
: this(packetNo, packet, packet.Length)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public PacketEventArgs(int packetNo, byte[] packet, int packetLen)
|
||||
{
|
||||
_PacketNo = packetNo;
|
||||
|
||||
|
||||
if (packet != null)
|
||||
{
|
||||
if (packet.Length <= packetLen)
|
||||
{
|
||||
_PacketLen = packetLen;
|
||||
}
|
||||
|
||||
_Packet = new byte[_PacketLen];
|
||||
Array.Copy(packet, 0, _Packet, 0, _PacketLen);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public int PacketNo
|
||||
{
|
||||
get { return _PacketNo; }
|
||||
}
|
||||
|
||||
public int PacketLen
|
||||
{
|
||||
get { return _PacketLen; }
|
||||
}
|
||||
|
||||
public byte[] Packet
|
||||
{
|
||||
get { return _Packet; }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
30
常用工具集/Utility/SerialDebug/FileTransmit/ITransmitUart.cs
Normal file
30
常用工具集/Utility/SerialDebug/FileTransmit/ITransmitUart.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace XMX.FileTransmit
|
||||
{
|
||||
public delegate void SendToUartEventHandler(object sender,SendToUartEventArgs e);
|
||||
|
||||
interface ITransmitUart
|
||||
{
|
||||
event SendToUartEventHandler SendToUartEvent;
|
||||
|
||||
void ReceivedFromUart(byte[] data);
|
||||
}
|
||||
|
||||
public class SendToUartEventArgs : EventArgs
|
||||
{
|
||||
private readonly byte[] _Data;
|
||||
|
||||
public SendToUartEventArgs(byte[] data)
|
||||
{
|
||||
_Data = data;
|
||||
}
|
||||
|
||||
public byte[] Data
|
||||
{
|
||||
get { return _Data; }
|
||||
}
|
||||
}
|
||||
}
|
||||
674
常用工具集/Utility/SerialDebug/FileTransmit/XModem.cs
Normal file
674
常用工具集/Utility/SerialDebug/FileTransmit/XModem.cs
Normal file
@@ -0,0 +1,674 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Collections;
|
||||
|
||||
namespace XMX.FileTransmit
|
||||
{
|
||||
|
||||
public enum XModemCheckMode
|
||||
{
|
||||
CheckSum,
|
||||
CRC16
|
||||
}
|
||||
|
||||
public enum XModemType
|
||||
{
|
||||
XModem,
|
||||
XModem_1K
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// XModem<65><6D><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
enum XmodemMessageType : int
|
||||
{
|
||||
KEY_C,
|
||||
ACK,
|
||||
NAK,
|
||||
EOT,
|
||||
PACKET,
|
||||
PACKET_ERROR,
|
||||
CAN
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// XModem<65><6D><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
internal class XmodemMessage
|
||||
{
|
||||
private XmodemMessageType _MessageType;
|
||||
private object _Value;
|
||||
|
||||
|
||||
public XmodemMessage(XmodemMessageType type)
|
||||
: this(type, null)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public XmodemMessage(XmodemMessageType type, object value)
|
||||
{
|
||||
_MessageType = type;
|
||||
_Value = value;
|
||||
}
|
||||
|
||||
|
||||
public XmodemMessageType MessageType
|
||||
{
|
||||
get { return _MessageType; }
|
||||
}
|
||||
|
||||
public object Value
|
||||
{
|
||||
get { return _Value; }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Xmodem<65><6D><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
|
||||
/// </summary>
|
||||
internal enum XmodemSendStage : int
|
||||
{
|
||||
WaitReceiveRequest, //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
PacketSending,
|
||||
WaitReceiveAnswerEndTransmit
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Xmodem<65><6D><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>
|
||||
/// </summary>
|
||||
internal enum XmodemReceiveStage : int
|
||||
{
|
||||
WaitForFirstPacket,
|
||||
PacketReceiving,
|
||||
}
|
||||
|
||||
public class XModemInfo
|
||||
{
|
||||
private XModemType _XModemType;
|
||||
private TransmitMode _TransType;
|
||||
private XModemCheckMode _CheckMode;
|
||||
|
||||
public XModemInfo()
|
||||
: this(XModemType.XModem, TransmitMode.Send, XModemCheckMode.CheckSum)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public XModemInfo(XModemType type, TransmitMode transType, XModemCheckMode checkType)
|
||||
{
|
||||
_XModemType = type;
|
||||
_TransType = transType;
|
||||
_CheckMode = checkType;
|
||||
}
|
||||
|
||||
|
||||
public XModemType Type
|
||||
{
|
||||
get { return _XModemType; }
|
||||
set { _XModemType = value; }
|
||||
}
|
||||
|
||||
public TransmitMode TransMode
|
||||
{
|
||||
get { return _TransType; }
|
||||
set { _TransType = value; }
|
||||
}
|
||||
|
||||
public XModemCheckMode CheckMode
|
||||
{
|
||||
get { return _CheckMode; }
|
||||
set { _CheckMode = value; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class XModem : IFileTramsmit, ITransmitUart
|
||||
{
|
||||
private readonly byte SOH = 0x01;
|
||||
private readonly byte EOT = 0x04;
|
||||
private readonly byte ACK = 0x06;
|
||||
private readonly byte NAK = 0x15;
|
||||
private readonly byte CAN = 0x18;
|
||||
|
||||
private readonly byte STX = 0x02;
|
||||
private readonly byte KEY_C = 0x43; //'C';
|
||||
|
||||
private int RetryMax = 6;
|
||||
XModemInfo xmodemInfo = new XModemInfo();
|
||||
|
||||
|
||||
private Thread TransThread;
|
||||
private bool IsStart = false;
|
||||
private int reTryCount;
|
||||
private ManualResetEvent waitReceiveEvent = new ManualResetEvent(false);
|
||||
|
||||
|
||||
private XmodemReceiveStage ReceiveStage;
|
||||
private XmodemSendStage SendStage;
|
||||
private Queue<XmodemMessage> msgQueue = new Queue<XmodemMessage>();
|
||||
|
||||
public XModem(TransmitMode transType, XModemType xmodemType, int reTryCount)
|
||||
{
|
||||
RetryMax = reTryCount;
|
||||
|
||||
xmodemInfo.CheckMode = XModemCheckMode.CheckSum;
|
||||
xmodemInfo.Type = xmodemType;
|
||||
xmodemInfo.TransMode = transType;
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
IsStart = true;
|
||||
reTryCount = 0;
|
||||
|
||||
|
||||
ReceiveStage = XmodemReceiveStage.WaitForFirstPacket;
|
||||
SendStage = XmodemSendStage.WaitReceiveRequest;
|
||||
msgQueue.Clear();
|
||||
|
||||
TransThread = new Thread(new ThreadStart(TransThreadHandler));
|
||||
TransThread.IsBackground = true;
|
||||
TransThread.Name = "XmodemTransThread";
|
||||
TransThread.Start();
|
||||
if (xmodemInfo.TransMode == TransmitMode.Receive)
|
||||
{
|
||||
if (StartReceive != null)
|
||||
{
|
||||
StartReceive(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
if (xmodemInfo.TransMode == TransmitMode.Receive)
|
||||
{
|
||||
Abort();
|
||||
}
|
||||
else
|
||||
{
|
||||
SendEOT();
|
||||
}
|
||||
|
||||
if (EndOfTransmit != null)
|
||||
{
|
||||
EndOfTransmit(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
|
||||
public void Abort()
|
||||
{
|
||||
IsStart = false;
|
||||
SendCAN();
|
||||
|
||||
if (EndOfTransmit != null)
|
||||
{
|
||||
EndOfTransmit(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
private void ParseReceivedMessage(byte[] data)
|
||||
{
|
||||
XmodemMessage ReceivedMessage = null;
|
||||
|
||||
if (data == null)
|
||||
{
|
||||
ReceivedMessage = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (data[0] == STX || data[0] == SOH)
|
||||
{
|
||||
ReceivedMessage = new XmodemMessage(XmodemMessageType.PACKET_ERROR);
|
||||
int packetLen = 0;
|
||||
if (data[0] == STX)
|
||||
{
|
||||
packetLen = 1024;
|
||||
}
|
||||
else if (data[0] == SOH)
|
||||
{
|
||||
packetLen = 128;
|
||||
}
|
||||
|
||||
int checkDataLen = xmodemInfo.CheckMode == XModemCheckMode.CheckSum ? 1 : 2;
|
||||
if (packetLen + 3 + checkDataLen == data.Length)
|
||||
{
|
||||
int packetNo = 0;
|
||||
if (data[1] == Convert.ToByte((~data[2]) & 0xFF))
|
||||
{
|
||||
packetNo = data[1];
|
||||
}
|
||||
|
||||
int frameCheckCode = 0;
|
||||
int calCheckCode = -1;
|
||||
byte[] packet = new byte[packetLen];
|
||||
|
||||
Array.Copy(data, 3, packet, 0, packetLen);
|
||||
if (xmodemInfo.CheckMode == XModemCheckMode.CheckSum)
|
||||
{
|
||||
frameCheckCode = data[3 + packetLen];
|
||||
calCheckCode = Convert.ToByte(DataCheck.GetCheckSum(packet) & 0xFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
frameCheckCode = (data[3 + packetLen] << 8) + data[3 + packetLen + 1];
|
||||
calCheckCode = Convert.ToUInt16(DataCheck.GetCRC(CRCType.CRC16_XMODEM, packet) & 0xFFFF);
|
||||
}
|
||||
|
||||
if (frameCheckCode == calCheckCode)
|
||||
{
|
||||
ReceivedMessage = new XmodemMessage(XmodemMessageType.PACKET, new PacketEventArgs(packetNo, packet));
|
||||
}
|
||||
|
||||
}
|
||||
msgQueue.Enqueue(ReceivedMessage);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (byte b in data)
|
||||
{
|
||||
ReceivedMessage = null;
|
||||
if (b == EOT)
|
||||
{
|
||||
ReceivedMessage = new XmodemMessage(XmodemMessageType.EOT);
|
||||
}
|
||||
else if (b == CAN)
|
||||
{
|
||||
ReceivedMessage = new XmodemMessage(XmodemMessageType.CAN);
|
||||
}
|
||||
else if (b == NAK)
|
||||
{
|
||||
ReceivedMessage = new XmodemMessage(XmodemMessageType.NAK);
|
||||
}
|
||||
else if (b == ACK)
|
||||
{
|
||||
ReceivedMessage = new XmodemMessage(XmodemMessageType.ACK);
|
||||
}
|
||||
else if (b == KEY_C)
|
||||
{
|
||||
ReceivedMessage = new XmodemMessage(XmodemMessageType.KEY_C);
|
||||
}
|
||||
|
||||
if (ReceivedMessage != null)
|
||||
{
|
||||
msgQueue.Enqueue(ReceivedMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
waitReceiveEvent.Set();
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void SendFrameToUart(byte data)
|
||||
{
|
||||
byte[] bytes = new byte[1];
|
||||
bytes[0] = data;
|
||||
SendFrameToUart(bytes);
|
||||
}
|
||||
private void SendFrameToUart(byte[] data)
|
||||
{
|
||||
if (SendToUartEvent != null)
|
||||
{
|
||||
SendToUartEvent(xmodemInfo, new SendToUartEventArgs(data));
|
||||
}
|
||||
}
|
||||
|
||||
private void SendACK()
|
||||
{
|
||||
SendFrameToUart(ACK);
|
||||
|
||||
}
|
||||
|
||||
private void SendNAK()
|
||||
{
|
||||
SendFrameToUart(NAK);
|
||||
}
|
||||
|
||||
private void SendKEYC()
|
||||
{
|
||||
SendFrameToUart(KEY_C);
|
||||
}
|
||||
|
||||
private void SendCAN()
|
||||
{
|
||||
byte[] bytes = new byte[5];
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
bytes[i] = CAN;
|
||||
}
|
||||
SendFrameToUart(bytes);
|
||||
}
|
||||
|
||||
private void SendEOT()
|
||||
{
|
||||
SendFrameToUart(EOT);
|
||||
SendStage = XmodemSendStage.WaitReceiveAnswerEndTransmit;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void TransThreadHandler()
|
||||
{
|
||||
while (IsStart)
|
||||
{
|
||||
if (xmodemInfo.TransMode == TransmitMode.Send)
|
||||
{
|
||||
SendHandler();
|
||||
}
|
||||
else if (xmodemInfo.TransMode == TransmitMode.Receive)
|
||||
{
|
||||
ReceiveHandler();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SendHandler()
|
||||
{
|
||||
XmodemMessage msg = null;
|
||||
lock (msgQueue)
|
||||
{
|
||||
if (msgQueue.Count > 0)
|
||||
{
|
||||
msg = msgQueue.Dequeue();
|
||||
}
|
||||
}
|
||||
|
||||
if (msg != null)
|
||||
{
|
||||
reTryCount = 0;
|
||||
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case XmodemMessageType.NAK:
|
||||
if (SendStage == XmodemSendStage.WaitReceiveRequest)
|
||||
{
|
||||
SendStage = XmodemSendStage.PacketSending;
|
||||
|
||||
xmodemInfo.CheckMode = XModemCheckMode.CheckSum;
|
||||
if (StartSend != null)
|
||||
{
|
||||
StartSend(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
else if (SendStage == XmodemSendStage.WaitReceiveAnswerEndTransmit)
|
||||
{
|
||||
SendEOT();
|
||||
}
|
||||
else
|
||||
{
|
||||
// ֪ͨ<CDA8>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>ͷһ<CDB7><D2BB>
|
||||
if (ReSendPacket != null)
|
||||
{
|
||||
ReSendPacket(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case XmodemMessageType.KEY_C:
|
||||
if (SendStage == XmodemSendStage.WaitReceiveRequest)
|
||||
{
|
||||
SendStage = XmodemSendStage.PacketSending;
|
||||
// ֪ͨ<CDA8><D6AA>ͷһ<CDB7><D2BB>CRC
|
||||
xmodemInfo.CheckMode = XModemCheckMode.CRC16;
|
||||
if (StartSend != null)
|
||||
{
|
||||
StartSend(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case XmodemMessageType.ACK:
|
||||
if (SendStage == XmodemSendStage.PacketSending)
|
||||
{
|
||||
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
if (SendNextPacket != null)
|
||||
{
|
||||
SendNextPacket(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
else if (SendStage == XmodemSendStage.WaitReceiveAnswerEndTransmit)
|
||||
{
|
||||
// ֪ͨ<CDA8><D6AA>ֹ
|
||||
//if (AbortTransmit != null)
|
||||
//{
|
||||
// AbortTransmit(xmodemInfo, null);
|
||||
//}
|
||||
if (EndOfTransmit != null)
|
||||
{
|
||||
EndOfTransmit(xmodemInfo, null);
|
||||
}
|
||||
IsStart = false;
|
||||
}
|
||||
break;
|
||||
|
||||
case XmodemMessageType.CAN:
|
||||
// ֪ͨ<CDA8><D6AA>ֹ
|
||||
if (AbortTransmit != null)
|
||||
{
|
||||
AbortTransmit(xmodemInfo, null);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (waitReceiveEvent.WaitOne(3000))
|
||||
{
|
||||
waitReceiveEvent.Reset();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
reTryCount++;
|
||||
if (reTryCount > RetryMax)
|
||||
{
|
||||
IsStart = false;
|
||||
//֪ͨ<CDA8><D6AA><EFBFBD>ճ<EFBFBD>ʱ
|
||||
if (TransmitTimeOut != null)
|
||||
{
|
||||
TransmitTimeOut(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ReceiveHandler()
|
||||
{
|
||||
if (ReceiveStage == XmodemReceiveStage.WaitForFirstPacket)
|
||||
{
|
||||
if (reTryCount % 2 == 0)
|
||||
{
|
||||
xmodemInfo.CheckMode = XModemCheckMode.CheckSum;
|
||||
SendKEYC();
|
||||
}
|
||||
else
|
||||
{
|
||||
xmodemInfo.CheckMode = XModemCheckMode.CRC16;
|
||||
SendNAK();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
XmodemMessage msg = null;
|
||||
lock (msgQueue)
|
||||
{
|
||||
if (msgQueue.Count > 0)
|
||||
{
|
||||
msg = msgQueue.Dequeue();
|
||||
}
|
||||
|
||||
}
|
||||
if (msg != null)
|
||||
{
|
||||
reTryCount = 0;
|
||||
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case XmodemMessageType.PACKET:
|
||||
ReceiveStage = XmodemReceiveStage.PacketReceiving;
|
||||
SendACK();
|
||||
if (ReceivedPacket != null)
|
||||
{
|
||||
PacketEventArgs e = msg.Value as PacketEventArgs;
|
||||
ReceivedPacket(xmodemInfo, new PacketEventArgs(e.PacketNo, e.Packet));
|
||||
}
|
||||
|
||||
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
if (SendNextPacket != null)
|
||||
{
|
||||
SendNextPacket(xmodemInfo, null);
|
||||
}
|
||||
break;
|
||||
case XmodemMessageType.PACKET_ERROR:
|
||||
SendNAK();
|
||||
// ֪ͨ<CDA8>ط<EFBFBD>
|
||||
if (ReSendPacket != null)
|
||||
{
|
||||
ReSendPacket(xmodemInfo, null);
|
||||
}
|
||||
break;
|
||||
case XmodemMessageType.EOT:
|
||||
SendACK();
|
||||
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>
|
||||
if (EndOfTransmit != null)
|
||||
{
|
||||
EndOfTransmit(xmodemInfo, null);
|
||||
}
|
||||
break;
|
||||
case XmodemMessageType.CAN:
|
||||
SendACK();
|
||||
// ֪ͨ<CDA8><D6AA>ֹ
|
||||
if (AbortTransmit != null)
|
||||
{
|
||||
AbortTransmit(xmodemInfo, null);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (waitReceiveEvent.WaitOne(3000))
|
||||
{
|
||||
waitReceiveEvent.Reset();
|
||||
}
|
||||
else
|
||||
{
|
||||
reTryCount++;
|
||||
if (reTryCount > RetryMax)
|
||||
{
|
||||
IsStart = false;
|
||||
//֪ͨ<CDA8><D6AA><EFBFBD>ճ<EFBFBD>ʱ
|
||||
if (TransmitTimeOut != null)
|
||||
{
|
||||
TransmitTimeOut(xmodemInfo, null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#region IFileTramsmit <EFBFBD><EFBFBD>Ա
|
||||
|
||||
public event EventHandler StartSend;
|
||||
|
||||
public event EventHandler StartReceive;
|
||||
|
||||
public event EventHandler SendNextPacket;
|
||||
|
||||
public event EventHandler ReSendPacket;
|
||||
|
||||
public event EventHandler AbortTransmit;
|
||||
|
||||
public event EventHandler EndOfTransmit;
|
||||
|
||||
public event EventHandler TransmitTimeOut;
|
||||
|
||||
public event PacketEventHandler ReceivedPacket;
|
||||
|
||||
public void SendPacket(PacketEventArgs packet)
|
||||
{
|
||||
int packetLen = 0;
|
||||
int checkLen = 0;
|
||||
byte[] data;
|
||||
|
||||
if (xmodemInfo.CheckMode == XModemCheckMode.CheckSum)
|
||||
{
|
||||
checkLen = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
checkLen = 2;
|
||||
}
|
||||
|
||||
if (xmodemInfo.Type == XModemType.XModem_1K)
|
||||
{
|
||||
packetLen = 1024;
|
||||
}
|
||||
else
|
||||
{
|
||||
packetLen = 128;
|
||||
}
|
||||
|
||||
data = new byte[3 + packetLen + checkLen];
|
||||
|
||||
data[0] = SOH;
|
||||
if (xmodemInfo.Type == XModemType.XModem_1K)
|
||||
{
|
||||
data[0] = STX;
|
||||
}
|
||||
|
||||
data[1] = Convert.ToByte(packet.PacketNo & 0xFF);
|
||||
data[2] = Convert.ToByte((~data[1]) & 0xFF);
|
||||
Array.Copy(packet.Packet, 0, data, 3, packetLen);
|
||||
|
||||
if (xmodemInfo.CheckMode == XModemCheckMode.CheckSum)
|
||||
{
|
||||
data[3 + packetLen] = Convert.ToByte(DataCheck.GetCheckSum(packet.Packet) & 0xFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
UInt16 crc = Convert.ToUInt16(DataCheck.GetCRC(CRCType.CRC16_XMODEM, packet.Packet) & 0xFFFF);
|
||||
data[3 + packetLen] = Convert.ToByte(crc >> 8);
|
||||
data[3 + packetLen + 1] = Convert.ToByte(crc & 0xFF);
|
||||
}
|
||||
|
||||
SendFrameToUart(data);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region ITransmitUart <EFBFBD><EFBFBD>Ա
|
||||
|
||||
public event SendToUartEventHandler SendToUartEvent;
|
||||
public void ReceivedFromUart(byte[] data)
|
||||
{
|
||||
ParseReceivedMessage(data);
|
||||
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
682
常用工具集/Utility/SerialDebug/FileTransmit/YModem.cs
Normal file
682
常用工具集/Utility/SerialDebug/FileTransmit/YModem.cs
Normal file
@@ -0,0 +1,682 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace XMX.FileTransmit
|
||||
{
|
||||
|
||||
public enum YModemCheckMode
|
||||
{
|
||||
CheckSum,
|
||||
CRC16
|
||||
}
|
||||
|
||||
public enum YModemType
|
||||
{
|
||||
YModem,
|
||||
YModem_1K
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// YModem<65><6D><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
enum YmodemMessageType : int
|
||||
{
|
||||
KEY_C,
|
||||
ACK,
|
||||
NAK,
|
||||
EOT,
|
||||
PACKET,
|
||||
PACKET_ERROR,
|
||||
CAN
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// YModem<65><6D><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
internal class YmodemMessage
|
||||
{
|
||||
private YmodemMessageType _MessageType;
|
||||
private object _Value;
|
||||
|
||||
|
||||
public YmodemMessage(YmodemMessageType type)
|
||||
: this(type, null)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public YmodemMessage(YmodemMessageType type, object value)
|
||||
{
|
||||
_MessageType = type;
|
||||
_Value = value;
|
||||
}
|
||||
|
||||
|
||||
public YmodemMessageType MessageType
|
||||
{
|
||||
get { return _MessageType; }
|
||||
}
|
||||
|
||||
public object Value
|
||||
{
|
||||
get { return _Value; }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Xmodem<65><6D><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
|
||||
/// </summary>
|
||||
internal enum YmodemSendStage : int
|
||||
{
|
||||
WaitReceiveRequestFileInfo, //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
|
||||
WaitReceiveRequestFirstPacket,
|
||||
PacketSending,
|
||||
WaitReceiveAnswerEndTransmit, // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>շ<EFBFBD>Ӧ<EFBFBD><D3A6>EOT
|
||||
WaitReceiveNextFileReq, // <20>ȵȽ<C8B5><C8BD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Xmodem<65><6D><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>
|
||||
/// </summary>
|
||||
internal enum YmodemReceiveStage : int
|
||||
{
|
||||
WaitForFileInfo,
|
||||
WaitForFirstPacket,
|
||||
PacketReceiving,
|
||||
}
|
||||
|
||||
public class YModemInfo
|
||||
{
|
||||
private YModemType _YModemType;
|
||||
private TransmitMode _TransType;
|
||||
|
||||
public YModemInfo()
|
||||
: this(YModemType.YModem, TransmitMode.Send)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public YModemInfo(YModemType type, TransmitMode transType)
|
||||
{
|
||||
_YModemType = type;
|
||||
_TransType = transType;
|
||||
}
|
||||
|
||||
|
||||
public YModemType Type
|
||||
{
|
||||
get { return _YModemType; }
|
||||
set { _YModemType = value; }
|
||||
}
|
||||
|
||||
public TransmitMode TransMode
|
||||
{
|
||||
get { return _TransType; }
|
||||
set { _TransType = value; }
|
||||
}
|
||||
|
||||
//public YModemCheckMode CheckMode
|
||||
//{
|
||||
// get { return _CheckMode; }
|
||||
// set { _CheckMode = value; }
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
public class YModem : IFileTramsmit, ITransmitUart
|
||||
{
|
||||
private readonly byte SOH = 0x01;
|
||||
private readonly byte STX = 0x02;
|
||||
private readonly byte EOT = 0x04;
|
||||
private readonly byte ACK = 0x06;
|
||||
private readonly byte NAK = 0x15;
|
||||
private readonly byte CAN = 0x18;
|
||||
private readonly byte KEY_C = 0x43; //'C';
|
||||
|
||||
private int RetryMax = 6;
|
||||
|
||||
YModemInfo ymodemInfo = new YModemInfo();
|
||||
|
||||
|
||||
private Thread TransThread;
|
||||
private bool IsStart = false;
|
||||
|
||||
private int reTryCount;
|
||||
private ManualResetEvent waitReceiveEvent = new ManualResetEvent(false);
|
||||
private YmodemReceiveStage ReceiveStage;
|
||||
private YmodemSendStage SendStage;
|
||||
private Queue<YmodemMessage> msgQueue = new Queue<YmodemMessage>();
|
||||
|
||||
public YModem(TransmitMode transType, YModemType ymodemType, int reTryCount)
|
||||
{
|
||||
RetryMax = reTryCount;
|
||||
|
||||
ymodemInfo.Type = ymodemType;
|
||||
ymodemInfo.TransMode = transType;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
if (ymodemInfo.TransMode == TransmitMode.Receive)
|
||||
{
|
||||
Abort();
|
||||
}
|
||||
else
|
||||
{
|
||||
SendEOT();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void Abort()
|
||||
{
|
||||
IsStart = false;
|
||||
SendCAN();
|
||||
|
||||
if (EndOfTransmit != null)
|
||||
{
|
||||
EndOfTransmit(ymodemInfo, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
private void ParseReceivedMessage(byte[] data)
|
||||
{
|
||||
|
||||
YmodemMessage ReceivedMessage = null;
|
||||
|
||||
if (data == null)
|
||||
{
|
||||
ReceivedMessage = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (data[0] == STX || data[0] == SOH)
|
||||
{
|
||||
ReceivedMessage = new YmodemMessage(YmodemMessageType.PACKET_ERROR);
|
||||
int packetLen = 0;
|
||||
if (data[0] == STX)
|
||||
{
|
||||
packetLen = 1024;
|
||||
}
|
||||
else if (data[0] == SOH)
|
||||
{
|
||||
packetLen = 128;
|
||||
}
|
||||
|
||||
int checkDataLen = 2;
|
||||
if (packetLen + 3 + checkDataLen == data.Length)
|
||||
{
|
||||
int packetNo = 0;
|
||||
if (data[1] == Convert.ToByte((~data[2]) & 0xFF))
|
||||
{
|
||||
packetNo = data[1];
|
||||
}
|
||||
|
||||
int frameCheckCode = 0;
|
||||
int calCheckCode = -1;
|
||||
byte[] packet = new byte[packetLen];
|
||||
|
||||
Array.Copy(data, 3, packet, 0, packetLen);
|
||||
|
||||
frameCheckCode = (data[3 + packetLen] << 8) + data[3 + packetLen + 1];
|
||||
calCheckCode = Convert.ToUInt16(DataCheck.GetCRC(CRCType.CRC16_XMODEM, packet) & 0xFFFF);
|
||||
|
||||
|
||||
if (frameCheckCode == calCheckCode)
|
||||
{
|
||||
ReceivedMessage = new YmodemMessage(YmodemMessageType.PACKET, new PacketEventArgs(packetNo, packet));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (byte b in data)
|
||||
{
|
||||
ReceivedMessage = null;
|
||||
|
||||
if (b == EOT)
|
||||
{
|
||||
ReceivedMessage = new YmodemMessage(YmodemMessageType.EOT);
|
||||
}
|
||||
else if (b == CAN)
|
||||
{
|
||||
ReceivedMessage = new YmodemMessage(YmodemMessageType.CAN);
|
||||
}
|
||||
else if (b == NAK)
|
||||
{
|
||||
ReceivedMessage = new YmodemMessage(YmodemMessageType.NAK);
|
||||
}
|
||||
else if (b == ACK)
|
||||
{
|
||||
ReceivedMessage = new YmodemMessage(YmodemMessageType.ACK);
|
||||
}
|
||||
else if (b == KEY_C)
|
||||
{
|
||||
ReceivedMessage = new YmodemMessage(YmodemMessageType.KEY_C);
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
if (ReceivedMessage!=null)
|
||||
{
|
||||
msgQueue.Enqueue(ReceivedMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
waitReceiveEvent.Set();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void SendFrameToUart(byte data)
|
||||
{
|
||||
byte[] bytes = new byte[1];
|
||||
bytes[0] = data;
|
||||
SendFrameToUart(bytes);
|
||||
}
|
||||
private void SendFrameToUart(byte[] data)
|
||||
{
|
||||
if (SendToUartEvent != null)
|
||||
{
|
||||
SendToUartEvent(ymodemInfo, new SendToUartEventArgs(data));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void SendACK()
|
||||
{
|
||||
SendFrameToUart(ACK);
|
||||
|
||||
}
|
||||
|
||||
private void SendNAK()
|
||||
{
|
||||
SendFrameToUart(NAK);
|
||||
}
|
||||
|
||||
private void SendKEYC()
|
||||
{
|
||||
SendFrameToUart(KEY_C);
|
||||
}
|
||||
|
||||
private void SendCAN()
|
||||
{
|
||||
byte[] bytes = new byte[5];
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
bytes[i] = CAN;
|
||||
}
|
||||
SendFrameToUart(bytes);
|
||||
|
||||
}
|
||||
|
||||
private void SendEOT()
|
||||
{
|
||||
SendFrameToUart(EOT);
|
||||
SendStage = YmodemSendStage.WaitReceiveAnswerEndTransmit;
|
||||
}
|
||||
|
||||
|
||||
private void SendNoFilesToSend()
|
||||
{
|
||||
//int packetLen = ymodemInfo.Type == YModemType.YModem ? 128 : 1024;
|
||||
byte[] endPacket = new byte[3 + 128 + 2];
|
||||
endPacket[0] = 0x01;
|
||||
endPacket[1] = 0x00;
|
||||
endPacket[2] = 0xFF;
|
||||
SendFrameToUart(endPacket);
|
||||
|
||||
if (EndOfTransmit != null)
|
||||
{
|
||||
EndOfTransmit(ymodemInfo, null);
|
||||
}
|
||||
IsStart = false;
|
||||
}
|
||||
|
||||
void TransThreadHandler()
|
||||
{
|
||||
while (IsStart)
|
||||
{
|
||||
if (ymodemInfo.TransMode == TransmitMode.Send)
|
||||
{
|
||||
SendHandler();
|
||||
}
|
||||
else if (ymodemInfo.TransMode == TransmitMode.Receive)
|
||||
{
|
||||
ReceiveHandler();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
// ֪ͨ<CDA8>ط<EFBFBD>
|
||||
if (ReSendPacket != null)
|
||||
{
|
||||
ReSendPacket(ymodemInfo, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
case YmodemMessageType.KEY_C:
|
||||
if (SendStage == YmodemSendStage.WaitReceiveRequestFileInfo)
|
||||
{
|
||||
// ֪ͨ<CDA8><D6AA>ͷһ<CDB7><D2BB>CRC
|
||||
if (StartSend != null)
|
||||
{
|
||||
StartSend(ymodemInfo, null);
|
||||
}
|
||||
}
|
||||
else if (SendStage == YmodemSendStage.WaitReceiveRequestFirstPacket) //<2F>ȴ<EFBFBD><C8B4><EFBFBD>һ<EFBFBD><D2BB>
|
||||
{
|
||||
SendStage = YmodemSendStage.PacketSending;
|
||||
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
if (SendNextPacket != null)
|
||||
{
|
||||
SendNextPacket(ymodemInfo, null);
|
||||
}
|
||||
}
|
||||
else if (SendStage == YmodemSendStage.WaitReceiveNextFileReq) //<2F><><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>
|
||||
{
|
||||
SendNoFilesToSend();
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
case YmodemMessageType.ACK:
|
||||
if (SendStage == YmodemSendStage.WaitReceiveRequestFileInfo)
|
||||
{
|
||||
SendStage = YmodemSendStage.WaitReceiveRequestFirstPacket; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
else if (SendStage == YmodemSendStage.PacketSending)
|
||||
{
|
||||
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
if (SendNextPacket != null)
|
||||
{
|
||||
SendNextPacket(ymodemInfo, null);
|
||||
}
|
||||
}
|
||||
else if (SendStage == YmodemSendStage.WaitReceiveAnswerEndTransmit)
|
||||
{
|
||||
SendStage = YmodemSendStage.WaitReceiveNextFileReq; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>
|
||||
}
|
||||
|
||||
break;
|
||||
case YmodemMessageType.CAN:
|
||||
// ֪ͨ<CDA8><D6AA>ֹ
|
||||
if (AbortTransmit != null)
|
||||
{
|
||||
AbortTransmit(ymodemInfo, null);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (waitReceiveEvent.WaitOne(3000))
|
||||
{
|
||||
waitReceiveEvent.Reset();
|
||||
}
|
||||
else
|
||||
{
|
||||
reTryCount++;
|
||||
if (reTryCount > RetryMax)
|
||||
{
|
||||
IsStart = false;
|
||||
//֪ͨ<CDA8><D6AA><EFBFBD>ճ<EFBFBD>ʱ
|
||||
if (TransmitTimeOut != null)
|
||||
{
|
||||
TransmitTimeOut(ymodemInfo, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void ReceiveHandler()
|
||||
{
|
||||
if (ReceiveStage == YmodemReceiveStage.WaitForFileInfo || ReceiveStage == YmodemReceiveStage.WaitForFirstPacket)
|
||||
{
|
||||
SendKEYC();
|
||||
}
|
||||
|
||||
if (msgQueue.Count > 0)
|
||||
{
|
||||
YmodemMessage msg = msgQueue.Dequeue();
|
||||
if (msg != null)
|
||||
{
|
||||
reTryCount = 0;
|
||||
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case YmodemMessageType.PACKET:
|
||||
|
||||
PacketEventArgs e = msg.Value as PacketEventArgs;
|
||||
if (ReceiveStage == YmodemReceiveStage.WaitForFileInfo)
|
||||
{
|
||||
if (e.PacketNo == 0)
|
||||
{
|
||||
ReceiveStage = YmodemReceiveStage.WaitForFirstPacket;
|
||||
SendACK();
|
||||
|
||||
if (ReceivedPacket != null)
|
||||
{
|
||||
ReceivedPacket(ymodemInfo, new PacketEventArgs(e.PacketNo, e.Packet));
|
||||
}
|
||||
}
|
||||
//else
|
||||
//{
|
||||
// SendNAK();
|
||||
//}
|
||||
}
|
||||
|
||||
else if (ReceiveStage == YmodemReceiveStage.WaitForFirstPacket ||
|
||||
ReceiveStage == YmodemReceiveStage.PacketReceiving)
|
||||
{
|
||||
if (ReceiveStage == YmodemReceiveStage.WaitForFirstPacket)
|
||||
{
|
||||
ReceiveStage = YmodemReceiveStage.PacketReceiving;
|
||||
}
|
||||
|
||||
SendACK();
|
||||
|
||||
if (ReceivedPacket != null)
|
||||
{
|
||||
ReceivedPacket(ymodemInfo, new PacketEventArgs(e.PacketNo, e.Packet));
|
||||
}
|
||||
|
||||
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
if (SendNextPacket != null)
|
||||
{
|
||||
SendNextPacket(ymodemInfo, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
case YmodemMessageType.PACKET_ERROR:
|
||||
SendNAK();
|
||||
// ֪ͨ<CDA8>ط<EFBFBD>
|
||||
if (ReSendPacket != null)
|
||||
{
|
||||
ReSendPacket(ymodemInfo, null);
|
||||
}
|
||||
break;
|
||||
case YmodemMessageType.EOT:
|
||||
SendACK();
|
||||
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>
|
||||
if (EndOfTransmit != null)
|
||||
{
|
||||
EndOfTransmit(ymodemInfo, null);
|
||||
}
|
||||
break;
|
||||
case YmodemMessageType.CAN:
|
||||
SendACK();
|
||||
// ֪ͨ<CDA8><D6AA>ֹ
|
||||
if (AbortTransmit != null)
|
||||
{
|
||||
AbortTransmit(ymodemInfo, null);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (waitReceiveEvent.WaitOne(3000))
|
||||
{
|
||||
waitReceiveEvent.Reset();
|
||||
}
|
||||
else
|
||||
{
|
||||
reTryCount++;
|
||||
if (reTryCount > RetryMax)
|
||||
{
|
||||
IsStart = false;
|
||||
//֪ͨ<CDA8><D6AA><EFBFBD>ճ<EFBFBD>ʱ
|
||||
if (TransmitTimeOut != null)
|
||||
{
|
||||
TransmitTimeOut(ymodemInfo, null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#region IFileTramsmit <EFBFBD><EFBFBD>Ա
|
||||
|
||||
public event EventHandler StartSend;
|
||||
|
||||
public event EventHandler StartReceive;
|
||||
|
||||
public event EventHandler SendNextPacket;
|
||||
|
||||
public event EventHandler ReSendPacket;
|
||||
|
||||
public event EventHandler AbortTransmit;
|
||||
|
||||
public event EventHandler EndOfTransmit;
|
||||
|
||||
public event EventHandler TransmitTimeOut;
|
||||
|
||||
public event PacketEventHandler ReceivedPacket;
|
||||
|
||||
public void SendPacket(PacketEventArgs packet)
|
||||
{
|
||||
int packetLen = 0;
|
||||
int checkLen = 0;
|
||||
byte[] data;
|
||||
|
||||
checkLen = 2;
|
||||
|
||||
if (ymodemInfo.Type == YModemType.YModem_1K)
|
||||
{
|
||||
packetLen = 1024;
|
||||
}
|
||||
else
|
||||
{
|
||||
packetLen = 128;
|
||||
}
|
||||
|
||||
data = new byte[3 + packetLen + checkLen];
|
||||
|
||||
data[0] = SOH;
|
||||
if (ymodemInfo.Type == YModemType.YModem_1K)
|
||||
{
|
||||
data[0] = STX;
|
||||
}
|
||||
|
||||
data[1] = Convert.ToByte(packet.PacketNo & 0xFF);
|
||||
data[2] = Convert.ToByte((~data[1]) & 0xFF);
|
||||
Array.Copy(packet.Packet, 0, data, 3, packetLen);
|
||||
|
||||
UInt16 crc = Convert.ToUInt16(DataCheck.GetCRC(CRCType.CRC16_XMODEM, packet.Packet) & 0xFFFF);
|
||||
data[3 + packetLen] = Convert.ToByte(crc >> 8);
|
||||
data[3 + packetLen + 1] = Convert.ToByte(crc & 0xFF);
|
||||
|
||||
|
||||
SendFrameToUart(data);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region ITransmitUart <EFBFBD><EFBFBD>Ա
|
||||
|
||||
public event SendToUartEventHandler SendToUartEvent;
|
||||
public void ReceivedFromUart(byte[] data)
|
||||
{
|
||||
ParseReceivedMessage(data);
|
||||
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user