private void sendYmodemClosingPacket(byte STX, int packetNumber, int invertedPacketNumber, byte[] data, int dataSize, byte[] CRC, int crcSize) { /* calculate CRC */ Crc16Ccitt crc16Ccitt = new Crc16Ccitt(InitialCrcValue.Zeros); CRC = crc16Ccitt.ComputeChecksumBytes(data); /* send the packet */ sendYmodemPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, CRC, crcSize); }
private void sendYmodemInitialPacket(byte STX, int packetNumber, int invertedPacketNumber, byte[] data, int dataSize, string path, FileStream fileStream, byte[] CRC, int crcSize) { string fileName = System.IO.Path.GetFileName(path); string fileSize = fileStream.Length.ToString(); /* add filename to data */ int i; for (i = 0; i < fileName.Length && (fileName.ToCharArray()[i] != 0); i++) { data[i] = (byte)fileName.ToCharArray()[i]; } data[i] = 0; /* add filesize to data */ int j; for (j = 0; j < fileSize.Length && (fileSize.ToCharArray()[j] != 0); j++) { data[(i + 1) + j] = (byte)fileSize.ToCharArray()[j]; } data[(i + 1) + j] = 0; /* fill the remaining data bytes with 0 */ for (int k = ((i + 1) + j) + 1; k < dataSize; k++) { data[k] = 0; } /* calculate CRC */ Crc16Ccitt crc16Ccitt = new Crc16Ccitt(InitialCrcValue.Zeros); CRC = crc16Ccitt.ComputeChecksumBytes(data); /* send the packet */ sendYmodemPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, CRC, crcSize); }
public bool YmodemUploadFile() { /* control signals */ const byte STX = 2; // Start of TeXt const byte EOT = 4; // End Of Transmission const byte ACK = 6; // Positive ACknowledgement const byte C = 67; // capital letter C /* sizes */ const int dataSize = 1024; const int crcSize = 2; /* THE PACKET: 1029 bytes */ /* header: 3 bytes */ // STX int invertedPacketNumber = 255; /* data: 1024 bytes */ byte[] data = new byte[dataSize]; /* footer: 2 bytes */ byte[] CRC = new byte[crcSize]; /* get the file */ FileStream fileStream = new FileStream(@path, FileMode.Open, FileAccess.Read); DateTime dt = DateTime.Now; byte[] ack; ack = new byte[] { 0x31 }; try { serialPort1.Write(ack, 0, 1); } catch { MessageBox.Show("Exception"); } Thread.Sleep(300); try { /* send the initial packet with filename and filesize */ //if (serialPort1.ReadByte() != C) //{ // Console.WriteLine("Can't begin the transfer."); // return false; //} sendYmodemInitialPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, path, fileStream, CRC, crcSize); if (serialPort1.ReadByte() != ACK) { MessageBox.Show("Can't send the initial packet."); return(false); } if (serialPort1.ReadByte() != C) { return(false); } /* send packets with a cycle until we send the last byte */ int fileReadCount; do { /* if this is the last packet fill the remaining bytes with 0 */ fileReadCount = fileStream.Read(data, 0, dataSize); if (fileReadCount == 0) { break; } if (fileReadCount != dataSize) { for (int i = fileReadCount; i < dataSize; i++) { data[i] = 0; } } /* calculate packetNumber */ packetNumber++; if (packetNumber > 255) { packetNumber -= 256; } ThreadFunction(); Console.WriteLine(packetNumber); /* calculate invertedPacketNumber */ invertedPacketNumber = 255 - packetNumber; /* calculate CRC */ Crc16Ccitt crc16Ccitt = new Crc16Ccitt(InitialCrcValue.Zeros); CRC = crc16Ccitt.ComputeChecksumBytes(data); /* send the packet */ sendYmodemPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, CRC, crcSize); /* wait for ACK */ if (serialPort1.ReadByte() != ACK) { Console.WriteLine("Couldn't send a packet."); return(false); } } while (dataSize == fileReadCount); /* send EOT (tell the downloader we are finished) */ serialPort1.Write(new byte[] { EOT }, 0, 1); /* send closing packet */ packetNumber = 0; invertedPacketNumber = 255; data = new byte[dataSize]; CRC = new byte[crcSize]; sendYmodemClosingPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, CRC, crcSize); /* get ACK (downloader acknowledge the EOT) */ if (serialPort1.ReadByte() != ACK) { Console.WriteLine("Can't complete the transfer."); return(false); } } catch (TimeoutException) { throw new Exception("Eductor does not answering"); } finally { fileStream.Close(); } Console.WriteLine("File transfer is succesful"); TimeSpan span = DateTime.Now - dt; btn_download.Invoke ( //委托,托管无参数的任何方法 new MethodInvoker ( delegate { btn_download.Text = "烧录完成"; } ) ); MessageBox.Show("烧录耗时:" + span.ToString(), "下载成功", MessageBoxButtons.OK, MessageBoxIcon.None); btn_download.Invoke ( //委托,托管无参数的任何方法 new MethodInvoker ( delegate { btn_download.Text = "开始烧录"; } ) ); return(true); }