Member 12941572 Ответов: 4

Я хочу отправить текстовый файл построчно через последовательный порт C#


Привет Ребята
я создал графический интерфейс в приложении Windows forms на c# для отправки и получения текстовых файлов через последовательный порт. И это успех, который я посылаю и получаю без каких-либо проблем

Но я хочу отправить строку за строкой через последовательный порт так что я буду получать строку за строкой может ли кто нибудь помочь мне пожалуйста

Вот мой код для отправки текстового файла

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)
      {
          try  //sending files through serial port
          {

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

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

          }

      }


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

я решил эту проблему в консольном приложении с помощью кода ,но я не знаю, как это написать для приложения windows forms на c#

List<string> list = new List<string>();
           using (StreamReader reader = new StreamReader(@"E:Text.txt"))
           {
               string line;
               while ((line = reader.ReadLine()) != null)
               {
                   list.Add(line); // Add to list.
                   Console.WriteLine(line); // Write to console.
               }
           }

[no name]

Почему вы думаете, что ваш" консольный " код каким-то образом не будет работать в вашем коде Winforms? выньте консоль.WriteLine и код будут работать точно так же. Нет кода C# для консольных приложений и C# для Winforms, это все C#.

Member 12941572

в winforms есть кнопки, как я уже упоминал в этом вопросе. куда мне вставить код ??

4 Ответов

Рейтинг:
2

Graeme_Grant

Этот вопрос возвращает меня в начало 1990-х...

Передача данных через последовательные порты-это не то же самое, что TCP/IP. Вам нужно добавить немного рукопожатия.

Это означает, что когда передатчик отправляет пакет данных приемнику, приемник должен ответить ответом ACK или NAK. Если ACK был принят передатчиком, то отправьте следующий блок; если NAK был получен, то отправьте повторно.

Кроме того, данные по RS232 могут быть повреждены. То же самое происходит и с TCP/IP, но транспортный уровень в TCP/IP автоматически повторяет попытки, а не RS232. Поэтому неплохо обернуть блок данных заголовком (описывает данные-например, идентификатор последовательности, тип данных и т. д.) и конечной контрольной суммой. Если контрольная сумма действительна на приемном конце, то получатель отвечает и ACK, если нет, то NAK. Когда получатель отправляет ответ, желательно также добавить идентификатор пакета и заголовок контрольной суммы/хвостовую оболочку. Это позволит сделать его проще для передатчика, чтобы оставаться в синхронизации или определить, если повредить данные были получены обратно.


Member 12941572

не получил ни единого слова :-)

0x01AA

Хе-хе, 5 за упоминание ностальгической части 90-х и, конечно же, более важной этой вещи для рукопожатия

Graeme_Grant

Это были дни черных ящиков... :)

Member 12941572

Ха ха но я до сих пор не получил ответа пожалуйста помогите мне ребята

0x01AA

Ха-ха, а где ты застрял?

Это простая вещь:
Отправитель:
Отправить...
Приемник:
Получать

..и упомянуто здесь достаточно много: получатель должен сообщить отправителю, когда он готов или не готов к приему. Либо аппаратным рукопожатием, либо программным рукопожатием xon/xoff

Member 12941572

да, когда я нажимаю на кнопку "Отправить", общий текстовый файл передается, но я хочу отправлять строку за строкой.? я попробовал использовать stream Reader, но не получил решения

Graeme_Grant

Есть ли куски, разделенные новым маркером линии (CR, CR/LF или LF)? Если да, то просто используйте string.Split метод.

Member 12941572

внутри блока отправки или внутри блока выбора файла

Graeme_Grant

1. Загрузите файл
2. разделительные линии
3. перебора строк &ампер; отправка в цикле - foreach(...), for(...;...;...), прием...

Рейтинг:
0

CPallini

Цитата:
в то время как ((строка = читатель.С readline()) != нуль)
{
Вы можете использовать тот же цикл для записи строк в последовательный порт.

Однако с точки зрения приемника ничего не меняется. Он должен различать различные линии на основе символа (символов) Терминатора линии.


Member 12941572

Я думаю, что вы не поняли мой вопрос, я должен прочитать текстовый файл строка за строкой, и это успех в консольном приложении. Что мне нужно, так это то, что та же операция будет выполнена в приложении winform, куда я вставлю код

0x01AA

А 5, даже ОП утверждает, что вы не понимаете его вопроса *лол*, но я совершенно убежден, что вы понимаете.

CPallini

:- ) Большое вам спасибо.

Member 12941572

я не нашел своего решения даже сейчас.

0x01AA

Чего именно вы ожидаете?

Graeme_Grant

Вы хотите, чтобы мы написали ваш код для вас?

Member 12941572

это не значит, что я жду от вас кода...
я попробовал то что он сказал но проблема не решена

Рейтинг:
0

Ankit Rajput

Привет,

Вы можете попробовать этот код. Я думаю, это решит вашу проблему.

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

using (StreamReader reader = new StreamReader(@"E:Text.txt"))
{
     string line;
     while ((line = reader.ReadLine()) != null)
     {
           //list.Add(line); // Add to list.
           serialPort1.Write(line + Environment.NewLine); 
     }
}

Я думаю, что этот код послужит вашей цели.


Member 12941572

на самом деле я не писал никаких данных во время выполнения программы , я должен отправить текстовый файл, который имеет 400 строк, которые я должен прочитать один за другим, надеюсь, вы понимаете, что я сказал