Пример #1
0
        public void GetData(int typeId)
        {
            FrameType type = (FrameType)typeId;

            byte[] ToDecode;
            byte[] Decoded;

            /*Log.Invoke(new EventHandler(delegate
             * {
             *  Log.AppendText("get frame " + type +"\n");
             * }));*/


            switch (type)
            {
            case FrameType.MSG:
                #region MSG
                if (IsConnected())
                {
                    int    n             = Port.BytesToRead;
                    byte[] msgByteBuffer = new byte[n];

                    Port.Read(msgByteBuffer, 0, n);     //считываем сообщение
                    string Message = Encoding.Default.GetString(msgByteBuffer);
                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText("(" + Port.PortName + ") GetData: new message > " + Message + "\n");
                    }));

                    WriteData(null, FrameType.ACK);
                }
                else
                {
                    WriteData(null, FrameType.RET_MSG);
                }
                break;

                #endregion
            case FrameType.FILEOK:
                #region FILEOK
                if (IsConnected())
                {
                    int    n             = Port.BytesToRead;
                    byte[] msgByteBuffer = new byte[n];

                    Port.Read(msgByteBuffer, 0, n);     //считываем сообщение
                    string Message = Encoding.Default.GetString(msgByteBuffer);
                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText("[" + DateTime.Now + "] : Получено предложение на прием файла размером: " + Message + "\n");
                    }));
                    //SuccessfulFrameNumber = int.Parse(Message);

                    if (MessageBox.Show("Файл. Размер: " + Message + " Кбайт.\nПринять?", "Прием файла", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        WriteData(null, FrameType.ACK);
                    }
                }
                else
                {
                    WriteData(null, FrameType.RET_MSG);
                }
                break;

                #endregion
            case FrameType.FRAME:
                #region FRAME
                //if (IsConnected())
                //{
                //    int n = Port.BytesToRead;
                //    byte[] msgByteBuffer = new byte[n];

                //    Port.Read(msgByteBuffer, 0, n); //считываем сообщение
                //    string Message = Encoding.Default.GetString(msgByteBuffer);
                //    Log.Invoke(new EventHandler(delegate
                //    {
                //        Log.AppendText("[" + DateTime.Now + "] : Получено подтверждение об успешной доставке Frame " + Message + "\n");
                //    }));
                //    SuccessfulFrameNumber = int.Parse(Message);

                //    WriteData(null, FrameType.FILE);
                //}
                //else
                //{
                //    WriteData(null, FrameType.RET_MSG);
                //}
                //break;
                #endregion
            case FrameType.FILE:

                #region FILE
                if (IsConnected())
                {
                    byte   fileId   = (byte)Port.ReadByte();
                    string typeFile = TypeFileAnalysis(fileId);

                    byte[] size = new byte[sizeLenght];
                    Port.Read(size, 0, sizeLenght);
                    int ssize = (int)Double.Parse(Encoding.Default.GetString(size));

                    byte[] byte_NumOfFrames = new byte[NumOfFrameLenght];
                    Port.Read(byte_NumOfFrames, 0, NumOfFrameLenght);
                    int NumOfFrames = (int)Double.Parse(Encoding.Default.GetString(byte_NumOfFrames));

                    byte[] byte_FrameNumber = new byte[NumOfFrameLenght];
                    Port.Read(byte_FrameNumber, 0, NumOfFrameLenght);
                    int FrameNumber = (int)Double.Parse(Encoding.Default.GetString(byte_FrameNumber));


                    if (FrameNumber == 1)
                    {
                        DialogResult result;
                        double       fileSize = Math.Round((double)ssize / 1024, 3);
                        result = MessageBox.Show("Файл. Размер: " + fileSize.ToString() + " Кбайт.\nПринять?", "Прием файла", MessageBoxButtons.YesNo);
                        if (result == DialogResult.Yes)
                        {
                            file_buffer = new byte[NumOfFrames * (Port.WriteBufferSize - 27)];
                        }

                        else
                        {
                            Display.Invoke(new EventHandler(delegate
                            {
                                Display.AppendText(
                                    "[" + DateTime.Now + "] : " + ": "
                                    + "Вы не сохранили файл"
                                    + "\r\n");
                                Display.ScrollToCaret();
                            }));
                        }
                    }


                    int    n       = Port.WriteBufferSize - InfoLen;
                    byte[] newPart = new byte[n];
                    Port.Read(newPart, 0, n);

                    newPart.CopyTo(file_buffer, n * (FrameNumber - 1));


                    if (FrameNumber == NumOfFrames)
                    {
                        Decoded  = new byte[ssize];
                        ToDecode = new byte[2];

                        for (int i = 0; i < ssize; i++)
                        {
                            ToDecode[0] = file_buffer[i * 2];
                            ToDecode[1] = file_buffer[(i * 2) + 1];
                            Decoded[i]  = Hamming.Decode(ToDecode);
                        }


                        SaveFileDialog saveFileDialog = new SaveFileDialog();

                        MainForm.Invoke(new EventHandler(delegate
                        {
                            saveFileDialog.FileName = "";
                            saveFileDialog.Filter   = "TypeFile (*." + typeFile + ")|*." + typeFile + "|All files (*.*)|*.*";
                            if (DialogResult.OK == saveFileDialog.ShowDialog())
                            {
                                File.WriteAllBytes(saveFileDialog.FileName, Decoded);
                                WriteData(null, FrameType.ACK);
                                Display.Invoke(new EventHandler(delegate
                                {
                                    Display.AppendText(
                                        "[" + DateTime.Now + "] : "
                                        + "Файл успешно получен"
                                        + "\r\n");
                                    Display.ScrollToCaret();
                                }));
                            }
                            else
                            {
                                // MessageBox.Show("Отмена ");
                                Display.Invoke(new EventHandler(delegate
                                {
                                    Display.AppendText(
                                        "[" + DateTime.Now + "] : " + ": "
                                        + "Вы не сохранили файл"
                                        + "\r\n");
                                    Display.ScrollToCaret();
                                }));
                            }
                        }));
                    }

                    WriteData(FrameNumber.ToString(), FrameType.FRAME);
                }
                else
                {
                    WriteData(null, FrameType.RET_FILE);
                }

                break;
                #endregion
            //======================================================



            case FrameType.ACK:
                #region ACK
                break;
                #endregion

            case FrameType.RET_MSG:
                #region RET_MSG
                Log.AppendText("Message error! No connection\n");
                break;
                #endregion

            case FrameType.RET_FILE:
                #region RET_FILE
                Log.AppendText("File error! No connection\n");
                break;
                #endregion
            }
        }
Пример #2
0
        public void WriteData(string input, FrameType type)
        {
            byte[] Header = { STARTBYTE, (byte)type };

            byte[] fileId = { 0 };
            byte[] size;
            byte[] NumOfFrames;
            byte[] FrameNumber;

            byte[] BufferToSend;
            byte[] Telegram;
            string Telegram_s;
            string size_s;

            byte[] ByteToEncode;
            byte[] ByteEncoded;


            switch (type)
            {
            case FrameType.MSG:
                #region MSG
                if (IsConnected())
                {
                    // Telegram[] = Coding(input);
                    Telegram = Encoding.Default.GetBytes(input);              //потом это кыш

                    BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    Telegram.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    Log.AppendText("(" + Port.PortName + ") WriteData: sent message >  " + Encoding.Default.GetString(Telegram) + "\n");
                }
                break;

                #endregion
            case FrameType.ACK:
                WriteData(FilePath, Connection.FrameType.FILE);
                break;

            case FrameType.FILEOK:
                if (IsConnected())
                {
                    ByteToEncode = File.ReadAllBytes(@input);
                    FilePath     = input;
                    size         = new byte[sizeLenght];
                    size         = Encoding.Default.GetBytes(((double)ByteToEncode.Length).ToString()); //нужны байты
                    //Telegram = Encoding.Default.GetBytes(size); //потом это кыш

                    BufferToSend = new byte[Header.Length + size.Length];     //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    size.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    size_s = Encoding.Default.GetString(size);
                    Log.AppendText("[" + DateTime.Now + "] Отправлена информация о размере файла: " + size_s + "\n");
                    //SuccessfulFrameNumber = int.Parse(Telegram_s);
                }
                break;

            case FrameType.FRAME:
                if (IsConnected())
                {
                    // Telegram[] = Coding(input);
                    Telegram = Encoding.Default.GetBytes(input);              //потом это кыш

                    BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    Telegram.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    Telegram_s = Encoding.Default.GetString(Telegram);
                    Log.AppendText("[" + DateTime.Now + "] получен Frame >  " + Telegram_s + " .Отправлено подтверждение о получении.\n");
                    //SuccessfulFrameNumber = int.Parse(Telegram_s);
                }
                break;

            case FrameType.FILE:
                #region FILE
                if (IsConnected())
                {
                    ByteToEncode = File.ReadAllBytes(@FilePath);

                    size = new byte[sizeLenght];
                    size = Encoding.Default.GetBytes(((double)ByteToEncode.Length).ToString());     //нужны байты
                    WriteData(Encoding.Default.GetString(size), FrameType.FILEOK);
                    NumOfFrames = new byte[NumOfFrameLenght];
                    FrameNumber = new byte[NumOfFrameLenght];

                    string typeFile = @input.Split('.')[1];
                    fileId[0] = TypeFile_to_IdFile(typeFile);


                    ByteEncoded = new byte[ByteToEncode.Length * 2];
                    for (int i = 0; i < ByteToEncode.Length; i++)
                    {
                        Hamming.HammingEncode74(ByteToEncode[i]).CopyTo(ByteEncoded, i * 2);
                    }

                    if (ByteEncoded.Length + InfoLen < Port.WriteBufferSize)
                    {
                        BufferToSend = new byte[InfoLen + ByteEncoded.Length];
                        Header.CopyTo(BufferToSend, 0);
                        fileId.CopyTo(BufferToSend, Header.Length);
                        size.CopyTo(BufferToSend, Header.Length + fileId.Length);

                        NumOfFrames = Encoding.Default.GetBytes(1.ToString());
                        NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght);

                        FrameNumber = Encoding.Default.GetBytes(1.ToString());
                        FrameNumber.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght + NumOfFrameLenght);


                        ByteEncoded.CopyTo(BufferToSend, InfoLen);
                        bool flag = false;
                        while (!flag)
                        {
                            if (MessageBox.Show("Отправить?", "Файл", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            {
                                flag = true;
                                Port.Write(BufferToSend, 0, BufferToSend.Length);

                                //loading.Hide();
                                MessageBox.Show("Готово!");
                                //loading.progressBar1.Value = 0;
                                //loading.i = 1;
                            }
                            else
                            {
                                flag = true;
                                //loading.Hide();
                                //loading.progressBar1.Value = 0;
                                MessageBox.Show("Вы отменили передачу файла.");
                                // loading.i = 1;
                            }
                        }
                    }
                    else
                    {
                        int EncodedByteIndex;
                        int Part_ByteEncodedIndex;

                        int parts = (int)Math.Ceiling((double)ByteEncoded.Length / (double)(Port.WriteBufferSize - InfoLen));
                        NumOfFrames = Encoding.Default.GetBytes(parts.ToString());

                        for (int i = 0; i < parts; i++)
                        {
                            EncodedByteIndex      = i * (Port.WriteBufferSize - InfoLen);
                            Part_ByteEncodedIndex = (Port.WriteBufferSize - InfoLen);

                            byte[] Part_ByteEncoded = new byte[Part_ByteEncodedIndex];

                            int Part_Len = 0;
                            if (((ByteEncoded.Length - EncodedByteIndex) >= Part_ByteEncodedIndex))
                            {
                                Part_Len = Part_ByteEncodedIndex;
                            }

                            else if (ByteEncoded.Length - EncodedByteIndex > 0)
                            {
                                Part_Len = ByteEncoded.Length - i * (Port.WriteBufferSize - InfoLen);
                            }


                            BufferToSend = new byte[Port.WriteBufferSize];

                            Header.CopyTo(BufferToSend, 0);
                            fileId.CopyTo(BufferToSend, Header.Length);
                            size.CopyTo(BufferToSend, Header.Length + fileId.Length);

                            NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght);

                            FrameNumber = Encoding.Default.GetBytes((i + 1).ToString());
                            FrameNumber.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght + NumOfFrameLenght);

                            Array.ConstrainedCopy(ByteEncoded, EncodedByteIndex, BufferToSend, InfoLen, Part_Len);

                            Log.AppendText("[" + DateTime.Now + "] : Отправляется фрейм: " + (SuccessfulFrameNumber + 1).ToString() + "\n");

                            Port.Write(BufferToSend, 0, BufferToSend.Length);
                            int ByteCheck;

                            if (i > 0)
                            {
                                int WaitTime = 0;
                                ByteCheck = Port.ReadByte();
                                while (ByteCheck != (int)STARTBYTE)
                                {
                                    if (WaitTime <= 10000)
                                    {
                                        Thread.Sleep(100);
                                        WaitTime += 100;
                                        ByteCheck = Port.ReadByte();
                                    }
                                }
                                ByteCheck = Port.ReadByte();
                                if (ByteCheck == (int)FrameType.FRAME)
                                {
                                    int    n             = Port.BytesToRead;
                                    byte[] msgByteBuffer = new byte[n];

                                    Port.Read(msgByteBuffer, 0, n);     //считываем сообщение
                                    string Message = Encoding.Default.GetString(msgByteBuffer);
                                    Log.Invoke(new EventHandler(delegate
                                    {
                                        Log.AppendText("[" + DateTime.Now + "] : Получено подтверждение об успешной доставке Frame " + Message + "\n");
                                    }));
                                    SuccessfulFrameNumber = int.Parse(Message);
                                }

                                if (i + 1 == SuccessfulFrameNumber)
                                {
                                    continue;
                                }


                                if (i + 1 != SuccessfulFrameNumber)
                                {
                                    MessageBox.Show("Передача файла прервана");
                                    break;
                                }
                            }
                        }
                    }
                }
                break;
                #endregion

            default:
                if (IsConnected())
                {
                    Port.Write(Header, 0, Header.Length);
                }
                break;
            }                                                                                                                                  //Зачем такая конструкция?
            Log.Invoke(new EventHandler(delegate
            {
                Log.AppendText("sent frame " + type + "\n"); //всё записываем, мы же снобы
            }));
        }
        public void GetData(int typeId)
        {
            FrameType type = (FrameType)typeId;

            byte[] ToDecode;
            byte[] Decoded;

            /*Log.Invoke(new EventHandler(delegate
             * {
             *  Log.AppendText("get frame " + type +"\n");
             * }));*/


            switch (type)
            {
            case FrameType.MSG:
                #region MSG
                if (IsConnected())
                {
                    int    n             = Port.BytesToRead;
                    byte[] msgByteBuffer = new byte[n];

                    Port.Read(msgByteBuffer, 0, n);     //считываем сообщение
                    string Message = Encoding.Default.GetString(msgByteBuffer);
                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText("(" + Port.PortName + ") GetData: новое сообщение > " + Message + "\n");
                    }));

                    WriteData(null, FrameType.ACK);
                }
                else
                {
                    WriteData(null, FrameType.RET_MSG);
                }
                break;

                #endregion
            case FrameType.FILEOK:
                #region FILEOK
                if (IsConnected())
                {
                    int    n             = Port.BytesToRead;
                    byte[] msgByteBuffer = new byte[n];

                    Port.Read(msgByteBuffer, 0, n);     //считываем сообщение
                    string Message = Encoding.Default.GetString(msgByteBuffer);
                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText("[" + DateTime.Now + "]: Получено предложение на прием файла размером: " + Message + " байт\n");
                    }));
                    //SuccessfulFrameNumber = int.Parse(Message);
                    int    Message_num = int.Parse(Message);
                    double fileSize    = Math.Round((double)Message_num / 1024, 3);
                    if (MessageBox.Show("Получено предложение на прием файла. Размер: " + fileSize.ToString() + " Кбайт.\nПринять?", "Прием файла", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        WriteData("OK", FrameType.ACK);

                        b_ChooseFile.Invoke(new EventHandler(delegate
                        {
                            b_ChooseFile.Enabled = false;
                        }));
                        b_OpenPort.Invoke(new EventHandler(delegate
                        {
                            b_OpenPort.Enabled = false;
                        }));
                    }
                }
                else
                {
                    MessageBox.Show("Нет соединения!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                break;
                #endregion

            case FrameType.FILE:
                while ((!IsConnected()) && (BreakConnection))
                {
                    Port.DiscardInBuffer();
                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText(
                            "[" + DateTime.Now + "]: "
                            + "Ожидание файла..."
                            + "\r\n");
                        Log.ScrollToCaret();
                        Thread.Sleep(1000);
                    }));
                }
                #region FILE
                if (IsConnected())
                {
                    byte   fileId   = (byte)Port.ReadByte();
                    string typeFile = TypeFileAnalysis(fileId);

                    byte[] size = new byte[sizeLenght];
                    Port.Read(size, 0, sizeLenght);
                    int ssize = (int)Double.Parse(Encoding.Default.GetString(size));

                    byte[] byte_NumOfFrames = new byte[NumOfFrameLenght];
                    Port.Read(byte_NumOfFrames, 0, NumOfFrameLenght);
                    int NumOfFrames = (int)Double.Parse(Encoding.Default.GetString(byte_NumOfFrames));

                    ProgressBar.Invoke(new EventHandler(delegate
                    {
                        ProgressBar.Visible = true;
                        ProgressBar.Maximum = NumOfFrames;
                    }));

                    byte[] byte_FrameNumber = new byte[NumOfFrameLenght];
                    Port.Read(byte_FrameNumber, 0, NumOfFrameLenght);
                    int FrameNumber = (int)Double.Parse(Encoding.Default.GetString(byte_FrameNumber));


                    if (FrameNumber == 1)
                    {
                        file_buffer = new byte[NumOfFrames * (Port.WriteBufferSize - 27)];
                    }

                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText(
                            "[" + DateTime.Now + "]: "
                            + "Загружен кадр "
                            + FrameNumber.ToString()
                            + "\r\n");
                        Log.ScrollToCaret();
                    }));
                    int    n       = Port.WriteBufferSize - InfoLen;
                    byte[] newPart = new byte[n];
                    Port.Read(newPart, 0, n);

                    newPart.CopyTo(file_buffer, n * (FrameNumber - 1));
                    if (ProgressBar.Value != FrameNumber)
                    {
                        ProgressBar.Invoke(new EventHandler(delegate
                        {
                            ProgressBar.Value++;
                        }));
                    }
                    WriteData(FrameNumber.ToString(), FrameType.FRAME);

                    if (FrameNumber == NumOfFrames)
                    {
                        Decoded  = new byte[ssize];
                        ToDecode = new byte[2];

                        for (int i = 0; i < ssize; i++)
                        {
                            ToDecode[0] = file_buffer[i * 2];
                            ToDecode[1] = file_buffer[(i * 2) + 1];
                            Decoded[i]  = Hamming.Decode(ToDecode);
                        }
                        Log.Invoke(new EventHandler(delegate
                        {
                            Log.AppendText(
                                "[" + DateTime.Now + "]: "
                                + "Файл успешно получен"
                                + "\r\n");
                            Log.ScrollToCaret();
                            b_ChooseFile.Enabled = true;
                            b_OpenPort.Enabled   = true;
                        }));

                        SaveFileDialog saveFileDialog = new SaveFileDialog();

                        MainForm.Invoke(new EventHandler(delegate
                        {
                            saveFileDialog.FileName = "";
                            saveFileDialog.Filter   = "TypeFile (*." + typeFile + ")|*." + typeFile + "|All files (*.*)|*.*";
                            if (DialogResult.OK == saveFileDialog.ShowDialog())
                            {
                                File.WriteAllBytes(saveFileDialog.FileName, Decoded);
                                //WriteData(null, FrameType.ACK);
                                Log.Invoke(new EventHandler(delegate
                                {
                                    Log.AppendText(
                                        "[" + DateTime.Now + "]: "
                                        + "Файл сохранен"
                                        + "\r\n");
                                    Log.ScrollToCaret();
                                    b_ChooseFile.Enabled = true;
                                    b_OpenPort.Enabled   = true;
                                }));
                            }
                            else
                            {
                                // MessageBox.Show("Отмена ");
                                Log.Invoke(new EventHandler(delegate
                                {
                                    Log.AppendText(
                                        "[" + DateTime.Now + "]: "
                                        + "Вы не сохранили файл"
                                        + "\r\n");
                                    Log.ScrollToCaret();
                                }));
                            }
                        }));
                        ProgressBar.Invoke(new EventHandler(delegate
                        {
                            ProgressBar.Value = 0;
                        }));
                    }
                }
                else
                {
                    WriteData(null, FrameType.ERR_FILE);
                }

                break;
                #endregion
            //======================================================

            case FrameType.ACK:
                #region ACK
                WriteData(FilePath, FrameType.FILE);
                break;
                #endregion

            case FrameType.RET_MSG:
                #region RET_MSG
                Log.AppendText("Ошибка отправки! Нет соединения\n");
                break;
                #endregion

            case FrameType.ERR_FILE:
                #region RET_FILE
                Log.AppendText("Ошибка отправки файла! Нет соединения\n");
                break;
                #endregion
            }
        }
        public void WriteData(string input, FrameType type)
        {
            byte[] Header = { STARTBYTE, (byte)type };

            byte[] fileId = { 0 };
            byte[] size;
            byte[] NumOfFrames;
            byte[] FrameNumber;

            byte[] BufferToSend;
            byte[] Telegram;
            string Telegram_s;
            string size_s;

            byte[] ByteToEncode;
            byte[] ByteEncoded;


            switch (type)
            {
            case FrameType.ERR_FILE:


                break;

            case FrameType.MSG:
                #region MSG
                if (IsConnected())
                {
                    // Telegram[] = Coding(input);
                    Telegram = Encoding.Default.GetBytes(input);              //потом это кыш

                    BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    Telegram.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    Log.AppendText("(" + Port.PortName + ") WriteData: sent message >  " + Encoding.Default.GetString(Telegram) + "\n");
                }
                break;
                #endregion

            case FrameType.ACK:
                #region ACK
                if (IsConnected())
                {
                    // Telegram[] = Coding(input);
                    Telegram = Encoding.Default.GetBytes(input);              //потом это кыш

                    BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    Telegram.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    Telegram_s = Encoding.Default.GetString(Telegram);
                    //Log.AppendText("[" + DateTime.Now + "] Отправлено ACK согласие на принятие файла: " + Telegram_s + "\n");
                }
                break;
                #endregion

            case FrameType.FILEOK:
                #region FILEOK
                if (IsConnected())
                {
                    ByteToEncode = File.ReadAllBytes(input);
                    FilePath     = input;
                    size         = new byte[sizeLenght];
                    size         = Encoding.Default.GetBytes(((double)ByteToEncode.Length).ToString()); //нужны байты
                    //Telegram = Encoding.Default.GetBytes(size); //потом это кыш

                    BufferToSend = new byte[Header.Length + size.Length];     //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    size.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    size_s = Encoding.Default.GetString(size);
                    Log.AppendText("[" + DateTime.Now + "] Отправлена информация о размере файла: " + size_s + " байт\n");
                    //SuccessfulFrameNumber = int.Parse(Telegram_s);
                }
                break;
                #endregion

            case FrameType.FRAME:
                #region FRAME
                if (IsConnected())
                {
                    // Telegram[] = Coding(input);
                    Telegram     = Encoding.Default.GetBytes(input);          //потом это кыш
                    BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    Telegram.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    Telegram_s = Encoding.Default.GetString(Telegram);
                    //Log.AppendText("[" + DateTime.Now + "] Получен кадр " + Telegram_s + " .Отправлено подтверждение о получении\n");
                    //SuccessfulFrameNumber = int.Parse(Telegram_s);
                }
                else
                {
                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText("[" + DateTime.Now + "]: Передача файла нарушена.");
                    }));
                    //MessageBox.Show("Соединение прервано. Передача нарушена.4");
                    BreakConnection = true;
                    break;
                }
                break;
                #endregion

            case FrameType.FILE:
                #region FILE
                int i;
                int parts = 0;
                int EncodedByteIndex;
                int Part_ByteEncodedIndex;
                ByteEncoded = new byte[0];
                size        = new byte[0];
                NumOfFrames = new byte[0];


                if (IsConnected())
                {
                    ByteToEncode = File.ReadAllBytes(@FilePath);
                    //b_ChooseFile.Invoke(new EventHandler(delegate
                    //{
                    //    b_ChooseFile.Enabled = false;
                    //}));
                    b_ChooseFile.Invoke(new EventHandler(delegate
                    {
                        b_ChooseFile.Enabled = false;
                    }));
                    b_OpenPort.Invoke(new EventHandler(delegate
                    {
                        b_OpenPort.Enabled = false;
                    }));
                    size = new byte[sizeLenght];
                    size = Encoding.Default.GetBytes(((double)ByteToEncode.Length).ToString());     //нужны байты
                    //WriteData(Encoding.Default.GetString(size), FrameType.FILEOK);
                    NumOfFrames = new byte[NumOfFrameLenght];
                    FrameNumber = new byte[NumOfFrameLenght];

                    string typeFile = @input.Split('.')[1];
                    fileId[0] = TypeFile_to_IdFile(typeFile);


                    ByteEncoded = new byte[ByteToEncode.Length * 2];
                    for (i = 0; i < ByteToEncode.Length; i++)
                    {
                        Hamming.HammingEncode74(ByteToEncode[i]).CopyTo(ByteEncoded, i * 2);
                    }

                    if (ByteEncoded.Length + InfoLen < Port.WriteBufferSize)
                    {
                        BufferToSend = new byte[InfoLen + ByteEncoded.Length];
                        Header.CopyTo(BufferToSend, 0);
                        fileId.CopyTo(BufferToSend, Header.Length);
                        size.CopyTo(BufferToSend, Header.Length + fileId.Length);

                        NumOfFrames = Encoding.Default.GetBytes(1.ToString());
                        NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght);

                        FrameNumber = Encoding.Default.GetBytes(1.ToString());
                        FrameNumber.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght + NumOfFrameLenght);


                        ByteEncoded.CopyTo(BufferToSend, InfoLen);
                        bool flag = false;
                        while (!flag)
                        {
                            if (MessageBox.Show("Отправить?", "Файл", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            {
                                flag = true;
                                Port.Write(BufferToSend, 0, BufferToSend.Length);

                                //loading.Hide();
                                MessageBox.Show("Готово!");
                                //loading.progressBar1.Value = 0;
                                //loading.i = 1;
                            }
                            else
                            {
                                flag = true;
                                //loading.Hide();
                                //loading.progressBar1.Value = 0;
                                MessageBox.Show("Вы отменили передачу файла.");
                                // loading.i = 1;
                            }
                        }
                    }
                    else
                    {
                        //EncodedByteIndex;
                        //Part_ByteEncodedIndex;

                        parts = (int)Math.Ceiling((double)ByteEncoded.Length / (double)(Port.WriteBufferSize - InfoLen));
                        ProgressBar.Invoke(new EventHandler(delegate
                        {
                            ProgressBar.Visible = true;
                            ProgressBar.Maximum = parts;
                        }));
                        NumOfFrames = Encoding.Default.GetBytes(parts.ToString());

                        for (i = 0; i < parts; i++)
                        {
                            EncodedByteIndex      = i * (Port.WriteBufferSize - InfoLen);
                            Part_ByteEncodedIndex = (Port.WriteBufferSize - InfoLen);

                            byte[] Part_ByteEncoded = new byte[Part_ByteEncodedIndex];

                            int Part_Len = 0;
                            if (((ByteEncoded.Length - EncodedByteIndex) >= Part_ByteEncodedIndex))
                            {
                                Part_Len = Part_ByteEncodedIndex;
                            }

                            else if (ByteEncoded.Length - EncodedByteIndex > 0)
                            {
                                Part_Len = ByteEncoded.Length - i * (Port.WriteBufferSize - InfoLen);
                            }


                            BufferToSend = new byte[Port.WriteBufferSize];

                            Header.CopyTo(BufferToSend, 0);
                            fileId.CopyTo(BufferToSend, Header.Length);
                            size.CopyTo(BufferToSend, Header.Length + fileId.Length);

                            NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght);

                            FrameNumber = Encoding.Default.GetBytes((i + 1).ToString());
                            FrameNumber.CopyTo(BufferToSend, Header.Length + fileId.Length + sizeLenght + NumOfFrameLenght);

                            Array.ConstrainedCopy(ByteEncoded, EncodedByteIndex, BufferToSend, InfoLen, Part_Len);

                            //Log.AppendText("[" + DateTime.Now + "]: Отправляется фрейм: " + (SuccessfulFrameNumber + 1).ToString() + "\n");
                            if (IsConnected())
                            {
                                Port.Write(BufferToSend, 0, BufferToSend.Length);
                            }
                            Log.Invoke(new EventHandler(delegate
                            {
                                Log.AppendText("[" + DateTime.Now + "]: Отправка кадра " + (i + 1).ToString() + "\n");
                                Log.ScrollToCaret();
                            }));
                            if (ProgressBar.Value != parts)
                            {
                                ProgressBar.Invoke(new EventHandler(delegate
                                {
                                    ProgressBar.Value++;
                                }));
                            }

                            byte[] ByteCheck = new byte[1];

                            if (i > 0 && IsConnected())
                            {
                                //Thread.Sleep(10);
                                int WaitTime = 0;
                                try
                                {
                                    Port.Read(ByteCheck, 0, 1);
                                }
                                catch (Exception e)
                                {
                                    Log.AppendText(e.Message);
                                    break;
                                }

                                while (ByteCheck[0] != STARTBYTE)
                                {
                                    if (WaitTime <= 100)
                                    {
                                        Thread.Sleep(10);
                                        WaitTime += 10;
                                        Port.Read(ByteCheck, 0, 1);
                                    }
                                    else
                                    {
                                        MessageBox.Show("Передача файла прервана");
                                        break;
                                    }
                                }
                                if (IsConnected())
                                {
                                    continue;
                                }
                                Port.Read(ByteCheck, 0, 1);
                                if (ByteCheck[0] == (int)FrameType.FRAME)
                                {
                                    int    n             = FrameNumber.Length;//Port.BytesToRead;
                                    byte[] msgByteBuffer = new byte[n];

                                    Port.Read(msgByteBuffer, 0, n);     //считываем сообщение
                                    string Message = Encoding.Default.GetString(msgByteBuffer);
                                    //Log.Invoke(new EventHandler(delegate
                                    //{
                                    //    Log.AppendText("[" + DateTime.Now + "] Получено подтверждение об успешной доставке кадра " + Message + "\n");
                                    //}));
                                    SuccessfulFrameNumber = int.Parse(Message);
                                }

                                if (i == SuccessfulFrameNumber)
                                {
                                    continue;
                                }


                                //if (i != SuccessfulFrameNumber)
                                //{

                                //    MessageBox.Show("Передача файла нарушена.1");
                                //    break;
                                //}
                            }
                            if (!IsConnected())
                            {
                                Log.Invoke(new EventHandler(delegate
                                {
                                    Log.AppendText("[" + DateTime.Now + "]: Передача файла нарушена\n");
                                }));
                                DialogResult result;
                                while (!IsConnected())
                                {
                                    result = MessageBox.Show("Соединение прервано. Передача нарушена.\n"
                                                             + "Восстановите соединение и нажмите ОК для докачки файла.\n"
                                                             + "Иначе нажмите ОТМЕНА.",
                                                             "Ошибка",
                                                             MessageBoxButtons.OKCancel,
                                                             MessageBoxIcon.Error);
                                    if (result == DialogResult.Cancel)
                                    {
                                        Log.Invoke(new EventHandler(delegate
                                        {
                                            Log.AppendText("[" + DateTime.Now + "]: Передача файла отменена\n");
                                        }));
                                        ProgressBar.Invoke(new EventHandler(delegate
                                        {
                                            ProgressBar.Value = 0;
                                        }));
                                        return;
                                    }
                                }
                                //BreakConnection = true;
                                i = SuccessfulFrameNumber - 1;
                                //break;
                            }
                        }
                        Log.Invoke(new EventHandler(delegate
                        {
                            Log.AppendText("[" + DateTime.Now + "]: Файл успешно передан\n");
                        }));
                        ProgressBar.Invoke(new EventHandler(delegate
                        {
                            ProgressBar.Value = 0;
                        }));
                        b_ChooseFile.Invoke(new EventHandler(delegate
                        {
                            b_ChooseFile.Enabled = true;
                        }));
                        b_OpenPort.Invoke(new EventHandler(delegate
                        {
                            b_OpenPort.Enabled = true;
                        }));
                    }
                }
                else
                {
                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText("[" + DateTime.Now + "]: Передача файла нарушена.\n" + "Последний успешный фрейм: " + SuccessfulFrameNumber.ToString());
                    }));
                    //MessageBox.Show("Соединение прервано. Передача нарушена.3");

                    BreakConnection = true;
                    break;
                }
                break;
                #endregion

            default:
                if (IsConnected())
                {
                    Port.Write(Header, 0, Header.Length);
                }
                break;
            }                                                                                                                                  //Зачем такая конструкция?
            //Log.Invoke(new EventHandler(delegate
            //{
            //    Log.AppendText("sent frame " + type + "\n"); //всё записываем, мы же снобы
            //}));
        }
Пример #5
0
        public void GetData(int typeId)
        {
            FrameType type = (FrameType)typeId;
            //FrameType frametype = (FrameType)Enum.ToObject(typeof(FrameType), frametypeid);
            int bytesToRead = Port.WriteBufferSize;

            byte[] byteBuffer;
            int    i;
            int    FileByteSize = 1;

            byte[] ToDecode;
            byte[] Decoded     = new byte[bytesToRead / 2];
            byte[] DecodedFull = new byte[FileByteSize];

            string typeFile = "0";

            //int parts;
            //string parts_s;
            //WriteLog(DirectionType.INCOMING, frametype);
            Log.Invoke(new EventHandler(delegate
            {
                Log.AppendText("get frame " + type + "\n");
            }));


            switch (type)
            {
            case FrameType.MSG:
                #region MSG
                if (IsConnected())
                {
                    int    n             = Port.BytesToRead;
                    byte[] msgByteBuffer = new byte[n];

                    Port.Read(msgByteBuffer, 0, n);     //считываем сообщение
                    string Message = Encoding.Default.GetString(msgByteBuffer);
                    Log.Invoke(new EventHandler(delegate
                    {
                        Log.AppendText("(" + Port.PortName + ") GetData: new message > " + Message + "\n");
                    }));

                    WriteData(null, FrameType.ACK);
                }
                else
                {
                    WriteData(null, FrameType.RET_MSG);
                }
                break;
                #endregion


            case FrameType.FILE:

                #region FILE
                if (IsConnected())
                {
                    //byte[] byteBuffer;

                    //byte[] size = new byte[10];
                    //Port.Read(size, 0, 10);
                    //string size_s = Encoding.Default.GetString(size);

                    //double ssize = Double.Parse(size_s); //размер файла //нужен ли он вообще /наверное, нужен

                    //int n = Port.BytesToRead;
                    //byteBuffer = new byte[n];
                    //Port.Read(byteBuffer, 0, n);

                    //Log.Invoke(new EventHandler(delegate
                    //{
                    //    Log.AppendText("(" + Port.PortName + ") : GetData: new file > " + byteBuffer.Length + " bytes\n");
                    //}));

                    //WriteData(null, FrameType.ACK);

                    //Port.ReadByte();
                    byte fileId = (byte)Port.ReadByte();
                    typeFile = TypeFileAnalysis(fileId);
                    byte[] size;
                    //byte[] NumOfFrames;
                    string size_s;
                    size = new byte[10];

                    Port.Read(size, 0, 10);
                    size_s = Encoding.Unicode.GetString(size);
                    //NumOfFrames = new byte[10];
                    //for (i = 0; i < NumOfFrames.Length; i++)
                    //{
                    //    NumOfFrames[i] = 0;
                    //}
                    //Port.Read(NumOfFrames, 0, 10);
                    //parts_s = Encoding.Unicode.GetString(NumOfFrames);
                    //parts = int.Parse(parts_s);
                    //MessageBox.Show(spd_s)
                    //double ssize;
                    //ssize = double.Parse(size_s);

                    DialogResult result;
                    result = MessageBox.Show("Файл. Размер: " + size_s + " Кбайт.\nПринять?", "Прием файла", MessageBoxButtons.YesNo);

                    if (result == DialogResult.Yes)
                    {
                        FileByteSize = (int)Math.Ceiling(double.Parse(size_s)) * 1024;
                        byte[] EncodedFile = new byte[FileByteSize * 2];
                        DecodedFull = new byte[FileByteSize];
                        int k = 0;
                        while (IsConnected() & bytesToRead * k < DecodedFull.Length)
                        {
                            byteBuffer = new byte[bytesToRead];
                            Port.Read(byteBuffer, 0, bytesToRead);
                            byteBuffer.CopyTo(EncodedFile, byteBuffer.Length * k);

                            Decoded  = new byte[EncodedFile.Length / 2];
                            ToDecode = new byte[2];
                            ;
                            for (i = 0; i < EncodedFile.Length / 2; i++)
                            {
                                ToDecode[0] = EncodedFile[i * 2];
                                ToDecode[1] = EncodedFile[(i * 2) + 1];
                                Decoded[i]  = Hamming.Decode(ToDecode);
                            }
                            //bytesToRead = Port.BytesToRead;
                            //byteBuffer = new byte[bytesToRead];
                            //Port.Read(byteBuffer, 0, bytesToRead);
                            //Decoded = new byte[bytesToRead / 2];
                            //ToDecode = new byte[2];
                            //;
                            //for (i = 0; i < bytesToRead / 2; i++)
                            //{
                            //    ToDecode[0] = byteBuffer[i * 2];
                            //    ToDecode[1] = byteBuffer[(i * 2) + 1];
                            //    Decoded[i] = Hamming.Decode(ToDecode);
                            //}


                            //Decoded.CopyTo(DecodedFull, Decoded.Length*k);
                            k++;
                        }

                        SaveFileDialog saveFileDialog = new SaveFileDialog();

                        MainForm.Invoke(new EventHandler(delegate
                        {
                            saveFileDialog.FileName = "";
                            saveFileDialog.Filter   = "TypeFile (*." + typeFile + ")|*." + typeFile + "|All files (*.*)|*.*";
                            if (DialogResult.OK == saveFileDialog.ShowDialog())
                            {
                                File.WriteAllBytes(saveFileDialog.FileName, Decoded);
                                WriteData(null, FrameType.ACK);
                                Display.Invoke(new EventHandler(delegate
                                {
                                    Display.AppendText(
                                        "[" + DateTime.Now + "] : "
                                        + "Файл успешно получен"
                                        + "\r\n");
                                    Display.ScrollToCaret();
                                }));
                            }
                            else
                            {
                                // MessageBox.Show("Отмена ");
                                Display.Invoke(new EventHandler(delegate
                                {
                                    Display.AppendText(
                                        "[" + DateTime.Now + "] : " + ": "
                                        + "Вы не сохранили файл"
                                        + "\r\n");
                                    Display.ScrollToCaret();
                                }));
                            }
                        }));
                    }
                    else
                    {
                        // MessageBox.Show("Отмена ");
                        Display.Invoke(new EventHandler(delegate
                        {
                            Display.AppendText(
                                "[" + DateTime.Now + "] : " + ": "
                                + "Вы не сохранили файл"
                                + "\r\n");
                            Display.ScrollToCaret();
                        }));
                    }
                }
                else
                {
                    WriteData(null, FrameType.RET_FILE);
                }

                break;
                #endregion
            //======================================================

            case FrameType.END:
                #region END
                if (IsConnected())
                {
                    SaveFileDialog saveFileDialog = new SaveFileDialog();

                    MainForm.Invoke(new EventHandler(delegate
                    {
                        saveFileDialog.FileName = "";
                        saveFileDialog.Filter   = "TypeFile (*." + typeFile + ")|*." + typeFile + "|All files (*.*)|*.*";
                        if (DialogResult.OK == saveFileDialog.ShowDialog())
                        {
                            File.WriteAllBytes(saveFileDialog.FileName, DecodedFull);    //!
                            WriteData(null, FrameType.ACK);
                            Display.Invoke(new EventHandler(delegate
                            {
                                Display.AppendText(
                                    "[" + DateTime.Now + "] : "
                                    + "Файл успешно получен"
                                    + "\r\n");
                                Display.ScrollToCaret();
                            }));
                        }
                        else
                        {
                            // MessageBox.Show("Отмена ");
                            Display.Invoke(new EventHandler(delegate
                            {
                                Display.AppendText(
                                    "[" + DateTime.Now + "] : " + ": "
                                    + "Вы не сохранили файл"
                                    + "\r\n");
                                Display.ScrollToCaret();
                            }));
                        }
                    }));
                }
                else
                {
                    WriteData(null, FrameType.RET_FILE);
                }
                break;

                #endregion
            case FrameType.ACK:
                #region ACK
                break;
                #endregion

            case FrameType.RET_MSG:
                #region RET_MSG
                Log.AppendText("Message error! No connection\n");
                break;
                #endregion

            case FrameType.RET_FILE:
                #region RET_FILE
                Log.AppendText("File error! No connection\n");
                break;
                #endregion
            }
        }
Пример #6
0
        public void WriteData(string input, FrameType type)
        //пока считаем, что input строка символов
        {
            byte[] Header = { STARTBYTE, (byte)type };
            byte[] BufferToSend;
            byte[] Telegram;

            //Я добавил:
            //byte[] Header = { STARTBYTE, receiver, (byte)type, sender };
            //byte[] BufferToSend;
            byte[] spd;
            byte[] size;
            byte[] ByteToEncode;
            byte[] ByteEncoded;
            byte[] NumOfFrames;
            byte[] fileId = { 0 };
            int    i;
            string result_s;

            switch (type)
            {
            case FrameType.MSG:
                #region MSG
                if (IsConnected())
                {
                    // Telegram[] = Coding(input);
                    Telegram = Encoding.Default.GetBytes(input);              //потом это кыш

                    BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    Telegram.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    Log.AppendText("(" + Port.PortName + ") WriteData: sent message >  " + Encoding.Default.GetString(Telegram) + "\n");
                }
                break;
                #endregion

            case FrameType.END:
                if (IsConnected())
                {
                    // Telegram[] = Coding(input);
                    Telegram = Encoding.Default.GetBytes(input);              //потом это кыш

                    BufferToSend = new byte[Header.Length + Telegram.Length]; //буфер для отправки = заголовок+сообщение
                    Header.CopyTo(BufferToSend, 0);
                    Telegram.CopyTo(BufferToSend, Header.Length);

                    Port.Write(BufferToSend, 0, BufferToSend.Length);
                    Log.AppendText("(" + Port.PortName + ") WriteData: sent message >  " + Encoding.Default.GetString(Telegram) + "\n");
                }
                break;

            case FrameType.FILE:
                #region FILE
                if (IsConnected())
                {
                    ByteToEncode = File.ReadAllBytes(@input);
                    size         = new byte[10];
                    //MessageBox.Show(((double)ByteToEncode.Length / 1048576).ToString());
                    size = Encoding.Unicode.GetBytes(((double)ByteToEncode.Length / 1024).ToString());     //1048576 байт = 1 Мбайт
                    //size = Encoding.Default.GetBytes((input.Length).ToString());
                    ByteEncoded = new byte[ByteToEncode.Length * 2];
                    i           = 0;

                    string typeFile = @input.Split('.')[1];
                    fileId[0] = TypeFile_to_IdFile(typeFile);

                    Display.AppendText("Длина ByteToEncode:" + ByteToEncode.Length + "\n");
                    foreach (byte item in ByteToEncode)
                    {
                        Hamming.HammingEncode74(ByteToEncode[i]).CopyTo(ByteEncoded, i * 2);
                        i++;
                        //Display.AppendText(i / ByteToEncode.Length * 100 + ", ");


                        //loading.progressBar1.Increment(i / ByteToEncode.Length * 100);
                    }
                    byte[] ToDecode = new byte[2];
                    byte[] Decoded  = new byte[ByteEncoded.Length / 2];

                    for (int m = 0; m < ByteEncoded.Length / 2; m++)
                    {
                        ToDecode[0] = ByteEncoded[m * 2];
                        ToDecode[1] = ByteEncoded[(m * 2) + 1];
                        Decoded[m]  = Hamming.Decode(ToDecode);
                    }
                    result_s = Encoding.UTF8.GetString(Decoded);                                                            // Сюда для проверки сохраняется раскодированный файл
                    //double parts;
                    //byte[] ToDecode;
                    //byte[] Decoded;
                    //byte[] byteBuffer;
                    //Decoded = new byte[ByteEncoded.Length / 2];
                    //ToDecode = new byte[2];
                    //byteBuffer = new byte[ByteEncoded.Length];
                    //for (int m = 0; m < ByteEncoded.Length / 2; m++)
                    //{
                    //    ToDecode[0] = ByteEncoded[m * 2];
                    //    ToDecode[1] = ByteEncoded[(m * 2) + 1];
                    //    Decoded[m] = Hamming.Decode(ToDecode);
                    //}
                    //string Decoded_decoded = Encoding.UTF8.GetString(Decoded);
                    //parts = (int)Math.Ceiling((double)ByteEncoded.Length / (double)(Port.WriteBufferSize - Header.Length - fileId.Length - 10));
                    //NumOfFrames = Encoding.Unicode.GetBytes((parts).ToString());
                    if (Header.Length + fileId.Length + ByteEncoded.Length + 8 < Port.WriteBufferSize)
                    {
                        BufferToSend = new byte[Header.Length + fileId.Length + 10 + ByteEncoded.Length];    //!
                        Header.CopyTo(BufferToSend, 0);
                        fileId.CopyTo(BufferToSend, Header.Length);
                        size.CopyTo(BufferToSend, Header.Length + fileId.Length);
                        //NumOfFrames.CopyTo(BufferToSend, Header.Length + fileId.Length + size.Length);
                        ByteEncoded.CopyTo(BufferToSend, Header.Length + fileId.Length + 10 /*+ NumOfFrames.Length*/);    //!
                        bool flag = false;
                        while (!flag)
                        {
                            //Application.DoEvents();
                            if (MessageBox.Show("Send?", "Test", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            {
                                flag = true;
                                Port.Write(BufferToSend, 0, BufferToSend.Length);
                                //loading.Hide();
                                MessageBox.Show("Готово!");
                                //loading.progressBar1.Value = 0;
                                //loading.i = 1;
                            }
                            else
                            {
                                flag = true;
                                //loading.Hide();
                                //loading.progressBar1.Value = 0;
                                MessageBox.Show("Вы отменили передачу файла.");
                                // loading.i = 1;
                            }
                        }
                    }
                    else
                    {
                        double parts;
                        int    EncodedByteIndex;
                        int    Part_ByteEncodedIndex;

                        parts = (double)ByteEncoded.Length / (double)(Port.WriteBufferSize /*- Header.Length - fileId.Length - 10*/);
                        MessageBox.Show(Port.WriteBufferSize.ToString() + " " + parts.ToString() + "\n" + ((int)Math.Ceiling(parts)).ToString());
                        for (i = 0; i <= (int)Math.Ceiling(parts); i++)
                        {
                            BufferToSend = new byte[Port.WriteBufferSize];    //!
                            Header.CopyTo(BufferToSend, 0);
                            fileId.CopyTo(BufferToSend, Header.Length);
                            size.CopyTo(BufferToSend, Header.Length + fileId.Length);
                            byte[] Part_ByteEncoded;
                            byte[] Last_Part;
                            Part_ByteEncoded      = new byte[Port.WriteBufferSize - Header.Length - fileId.Length - 10];
                            EncodedByteIndex      = i * (Port.WriteBufferSize - Header.Length - fileId.Length - 10);
                            Part_ByteEncodedIndex = (Port.WriteBufferSize - Header.Length - fileId.Length - 10);
                            if (((ByteEncoded.Length - EncodedByteIndex) >= Part_ByteEncodedIndex))
                            {
                                Array.ConstrainedCopy(ByteEncoded, EncodedByteIndex, Part_ByteEncoded, 0, Part_ByteEncodedIndex);
                                ToDecode = new byte[2];
                                Decoded  = new byte[Part_ByteEncoded.Length / 2];

                                for (int m = 0; m < Part_ByteEncoded.Length / 2; m++)
                                {
                                    ToDecode[0] = Part_ByteEncoded[m * 2];
                                    ToDecode[1] = Part_ByteEncoded[(m * 2) + 1];
                                    Decoded[m]  = Hamming.Decode(ToDecode);
                                }
                                result_s = Encoding.UTF8.GetString(Decoded);                                  // Сюда для проверки сохраняется раскодированная посылаемая часть файла
                                Part_ByteEncoded.CopyTo(BufferToSend, Header.Length + fileId.Length + 10);    //!
                            }
                            else if (ByteEncoded.Length - EncodedByteIndex > 0)
                            {
                                Last_Part = new byte [ByteEncoded.Length - i * Port.WriteBufferSize];
                                Array.ConstrainedCopy(ByteEncoded, EncodedByteIndex, Last_Part, 0, ByteEncoded.Length - i * Port.WriteBufferSize);
                                Last_Part.CopyTo(BufferToSend, Header.Length + fileId.Length + 10);    //!
                                Port.Write(BufferToSend, 0, BufferToSend.Length);

                                break;
                            }

                            Port.Write(BufferToSend, 0, BufferToSend.Length);
                        }
                    }

                    //WriteData("EOF", FrameType.END);
                }
                break;
                #endregion

            default:
                if (IsConnected())
                {
                    Port.Write(Header, 0, Header.Length);
                }
                break;
            }

            //Зачем такая конструкция?
            Log.Invoke(new EventHandler(delegate
            {
                Log.AppendText("sent frame " + type + "\n"); //всё записываем, мы же снобы
            }));
        }