初始化上传

This commit is contained in:
2025-08-26 08:37:44 +08:00
commit 31d81b91b6
448 changed files with 80981 additions and 0 deletions

View 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
}
}

View 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; }
}
}
}

View 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; }
}
}
}

View 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
}
}

View 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
}
}