Member 12941572 Ответов: 1

Как отправить отправки данных через последовательный по времени в C#?


Всем привет

Я отправляю и получаю текстовые файлы через последовательный порт в c# без каких-либо проблем . Но я хочу отправить данные в соответствии с размером памяти в текстовом файле "например, отправить 1 кб в 1 секунду, следующий 1 кб в следующую секунду ".
Я работаю над этим с давних пор и до сих пор не получил идеального решения

Вот мой код
private void butSetFile_Click(object sender, EventArgs e)
     {
         this.openFileDialog1.ShowDialog();

         this.txtfile2.Text = this.openFileDialog1.FileName;


     }

     private void butSendFile_Click(object sender, EventArgs e)
     {

             if (serialPort1.IsOpen == false)
             {
                 this.serialPort1.Open();
             }

             serialPort1.Write(System.IO.File.ReadAllText(this.txtfile2.Text));

         }


Что я уже пробовал:

Я также попробовал функцию StremReader и буферы. Но не получил результата то что мне нужно Может ли кто нибудь мне помочь

я также использовал этот код
List<string> list = new List<string>();
          using (StreamReader reader = new StreamReader(this.txtfile2.Text))
          {
              string line;
              while ((line = reader.ReadLine()) != null)
              {
                  list.Add(line); // Add to list.

}
}

1 Ответов

Рейтинг:
1

Jochen Arndt

Просто считайте файл в строку. Затем вы можете отправить порции по 1 кб с помощью SubString(blockNumber * 1024, 1024) где blockNumber увеличивается после записи каждого блока до тех пор, пока все блоки не будут отправлены.

Программный поток:

Глобальный объект:

string buffer;
int blockNumber = -1;

Установите файл / нажмите кнопку Отправить файл:
buffer = System.IO.File.ReadAllText(this.openFileDialog1.FileName);
if (!buffer.IsNullOrEmpty())
{
    if (serialPort1.IsOpen == false)
    {
        this.serialPort1.Open();
    }
    blockNumber = 0;
    // start timer
}

Функция события таймера:
if (blockNumber >= 0)
{
    string blockString = buffer.SubString(blockNumber * 1024, 1024);
    // Empty if all data has been send
    if (!blockString.IsNullOrEmpty())
    {
        serialPort1.Write(blockString);
        blockNumber++;
    }
    else
    //OR: if (blockString.IsNullOrEmpty() || blockString.Length() < 1024)
    {
        blockNumber = -1;
        buffer = "";
        // stop timer
    }
}


Member 12941572

я использую ваш код внутри файла btnSendFile но в этом месте у меня возникла ошибка

 if (!buffer.IsNullOrEmpty()) 
и где я должен написать код для функции события таймера ? внутри любой кнопки или в основной функции ??

Jochen Arndt

Мое решение - это просто скелет / программный поток и не готово к использованию.
Вы должны реализовать его самостоятельно с помощью таймера (см. https://msdn.microsoft.com/en-us/library/system.timers.timer (v=против 110). aspx).

Все это должно быть обернуто в класс, где таймер и глобальные объекты являются членами класса.

Блок кода "Set File / click send file" может быть помещен в вашу функцию butSetFile_Click() как она есть или в вашу функцию butSendFile_Click() при использовании сохраненного имени файла.

Обработчик событий таймера может быть функцией OnTimedEvent () (см. Пример из приведенной выше ссылки таймера).

См. также пример инициализации, запуска и остановки таймера.

Это быстрый ответ, и у меня нет времени писать и тестировать весь код. Мы здесь тоже неоплачиваемые добровольцы, выполняющие свою обычную работу.

Просто попробуйте сделать это сами. При этом вы также научитесь лучше. Если вы где-то застряли, вы всегда можете задать новый вопрос.