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(string path) { bool returnValue = false; /* control signals */ const byte STX = 2; // Start of TeXt const byte EOT = 4; // End Of Transmission const byte ACK = 6; // Positive ACknowledgement const byte NACK = 21; // Negative 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 packetNumber = 0; 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); try { /* send the initial packet with filename and filesize */ int count = 0; while (serialPort.ReadByte() != C) { if (count++ > 1000) { Console.WriteLine("\r\nCan't begin the transfer."); return(false); } } sendYmodemInitialPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, path, fileStream, CRC, crcSize); count = 0; while (serialPort.ReadByte() != ACK) { if (count++ > 1000) { Console.WriteLine("\r\nCan't send the initial packet."); return(false); } } count = 0; while (serialPort.ReadByte() != C) { if (count++ > 1000) { Console.WriteLine("\r\nError"); 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; } 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); count = 0; while (serialPort.ReadByte() != ACK) { if (count++ > 1000) { Console.WriteLine("\r\nCan't recevie acknowledgement."); return(false); } } } while (dataSize == fileReadCount); /* send closing packet */ packetNumber = 0; invertedPacketNumber = 255; data = new byte[dataSize]; CRC = new byte[crcSize]; sendYmodemClosingPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, CRC, crcSize); /* get NACK (downloader acknowledge the EOT) */ count = 0; while (serialPort.ReadByte() != NACK) { if (count++ > 1000) { Console.WriteLine("\r\nCan't recevie negative acknowledgement."); return(false); } } /* send EOT (tell the downloader we are finished) */ serialPort.Write(new byte[] { EOT }, 0, 1); returnValue = true; } catch (TimeoutException) { Console.WriteLine("\r\nTimeout."); //throw new Exception("Eductor does not answering"); } finally { fileStream.Close(); } if (returnValue) { Console.WriteLine("\r\nFile transfer is succesful."); } return(returnValue); }