資源簡(jiǎn)介
Xmodem 協(xié)議傳輸由接收程序和發(fā)送程序完成。先由接收程序發(fā)送協(xié)商字符,協(xié)商校驗(yàn)方式,協(xié)商通過(guò)之后發(fā)送程序就開(kāi)始發(fā)送數(shù)據(jù)包,接收程序接收到完整的一個(gè)數(shù)據(jù)包之后, 按照協(xié)商的方式對(duì)數(shù)據(jù)包進(jìn)行校驗(yàn)。校驗(yàn)通過(guò)之后發(fā)送確認(rèn)字符,然后發(fā)送程序繼續(xù)發(fā)送下一包;如果校驗(yàn)失敗,則發(fā)送否認(rèn)字符,發(fā)送程序重傳此數(shù)據(jù)包。
Xmodem協(xié)議是由Ward Chritensen于70年代提出并實(shí)現(xiàn)的,傳輸數(shù)據(jù)單位為信息包。
Xmodem 協(xié)議一般支持128 字節(jié)的數(shù)據(jù)包,并且支持校驗(yàn)和、CRC 兩種校驗(yàn)方式。
參考:
https://blog.csdn.net/qq61394323/article/details/77324156
https://blog.csdn.net/m0_37756916/article/details/76064727

代碼片段和文件信息
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.Threading;
namespace?RUDPSLib.XModem1
{
????//Version?1.3
????//This?class?is?tested?to?be?100%?compatibel?to?Microsoft(r)?Hyperterminal?5.1
????//XmodemTransmit:?supports?both?CRC?and?checksum
????//XModemReceive:?only?supports?checksum
????//Feel?free?to?use/modify/copy/distribute?this?file
????public?class?XModem
????{
????????#region?Events
????????private?System.EventHandler?PacketReceivedEvent;
????????public?event?System.EventHandler?PacketReceived
????????{
????????????add
????????????{
????????????????PacketReceivedEvent?=?(System.EventHandler)System.Delegate.Combine(PacketReceivedEvent?value);
????????????}
????????????remove
????????????{
????????????????PacketReceivedEvent?=?(System.EventHandler)System.Delegate.Remove(PacketReceivedEvent?value);
????????????}
????????}
????????public?delegate?void?PacketSentEventHandler(int?TXStringSize);
????????private?PacketSentEventHandler?PacketSentEvent;
????????public?event?PacketSentEventHandler?PacketSent
????????{
????????????add
????????????{
????????????????PacketSentEvent?=?(PacketSentEventHandler)System.Delegate.Combine(PacketSentEvent?value);
????????????}
????????????remove
????????????{
????????????????PacketSentEvent?=?(PacketSentEventHandler)System.Delegate.Remove(PacketSentEvent?value);
????????????}
????????}
????????#endregion
????????#region?Members
????????private?System.IO.Ports.SerialPort?port?=?null;
????????private?byte?SOH?=?(byte)(0x01);
????????//header?for?128byte-packets
????????private?byte?STX?=?(byte)(0x02);
????????//header?for?1024byte-packets
????????private?byte?EOT?=?(byte)(0x04);
????????//end?of?transmission
????????private?byte?ACK?=?(byte)(0x06);
????????//acknowledge
????????private?byte?NAK?=?(byte)(0x15);
????????//negativ?acknowledge
????????private?byte?CAN?=?(byte)(0x18);
????????///?
????????///?cancel?transfer
????????///?
????????private?byte?CTRLZ?=?(byte)(0x1A);
????????//padding?char?to?fill?data?blocks?????????private?byte?C_pad?=?(byte)(0x43);
????????//start?of?a?CRC?request
????????private?ushort?MAXRETRANS?=?System.Convert.ToUInt16(25);
????????//1024?for?XModem?1k?+?3?head?chars?+?2?crc?+?nul
????????private?byte[]?xbuff?=?new?byte[1029];
????????private?int?bufsz;
????????private?int?crc?=?1;
????????private?byte?packetno?=?(byte)1;
????????private?int?i;
????????private?int?c;
????????private?int?len?=?0;
????????private?int?retry;
????????#endregion
????????#region?Constructor
????????public?XModem(System.IO.Ports.SerialPort?port)
????????{
????????????if?(!port.IsOpen)
????????????????port.Open();
????????????this.port?=?port;
????????}
????????#endregion
????????#region?Implementation
????????#region?XModemReceive
????????//
????????//receive?byte?Array?via?XModem?using?either
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件???????16017??2018-07-05?14:27??XModem.cs
評(píng)論
共有 條評(píng)論