Member 12990959 Ответов: 2

Как получить текстовый файл с последовательного порта C# ..?


привет ребята

я создаю небольшой графический интерфейс для отправки и приема данных через последовательный порт. я дал два способа отправки данных: 1) текстовый файл; 2) прямой ввод текста в текстовое поле.
я успешно получаю ответ, если отправляю данные в текстовое поле , но проблема в том, как я могу получать текстовые файлы

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

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

private void button5_Click(object sender, EventArgs e)
       {
           try
           {
               if (serialPort1.IsOpen)
               {
                   txtReceive.Text = serialPort1.ReadExisting();
                   txtReceive.Clear();
               }



           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message, "message", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }
       }


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

Richard MacCutchan

Что вы имеете в виду "как я могу получать текстовые файлы" Последовательный порт-это просто то, что он получает и отправляет байты (а не символы, строки или файлы) путем последовательной передачи. Это зависит от вас, чтобы захватить любые полученные данные и обработать их в соответствии с требованиями вашего приложения.

[no name]

Начните с загрузки PuTTY: бесплатный SSH-и Telnet-клиент[^]. Настройте его и убедитесь, что данные действительно отправляются (что вы можете их получить), и идите оттуда.

2 Ответов

Рейтинг:
2

Jochen Arndt

Вы не получили файлы. Вы получаете данные. То, как эти данные должны быть интерпретированы, зависит от ваших спецификаций. Если данные представляют собой текстовые строки, их можно отобразить в текстовом поле или сохранить в файл. Но это какая-то постобработка и никак не связана с последовательной связью.

В этом нет никакого смысла:

txtReceive.Text = serialPort1.ReadExisting();
txtReceive.Clear();
Вы устанавливаете содержимое текстового поля и сразу же после этого очищаете его.


Member 12990959

хорошо я хочу отобразить текст в текстовом поле то что мы отправили через текстовый файл

txtReceive.Текст = serialPort1.ReadExisting();
txtReceive.Четкий();

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

Jochen Arndt

"этот код помогает мне отображать код, который мы посылаем в виде сообщения"
Но вы копируете полученный текст в текстовое поле и затем очищаете его. То есть у вас есть пустое текстовое поле и полученная строка теряется!

Чтобы записать полученный текст в текстовый файл, считайте его в переменную и просто запишите это:

строка получена = serialPort1. ReadExisting();
Системы.ИО.Файл.WriteAllText(имя файла, получено);

Рейтинг:
0

OriginalGriff

Когда данные поступают из последовательного порта, у них нет никаких указаний на то, откуда они пришли - это просто поток байтов - или в вашем случае поток символов, которые составляют строку.
Если вы хотите отправить текстовый файл, то вам нужно предоставить способ получающему программному обеспечению идентифицировать его как текстовый файл, а не сообщение - либо предоставив "заголовок", который не может быть набран, либо реализовав протокол между отправителем и получателем, который означает, что они всегда знают, что они получают.
Без этого - что требует изменений в программном обеспечении отправки, а также приема - вы не можете сказать, откуда пришли данные.

И кстати: последовательные порты не являются мгновенными. Передача данных занимает много времени, поэтому использование ReadExisting может не дать вам всего сообщения за один раз!


Member 12990959

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

OriginalGriff

Не имеет значения, как настроен ваш порт - если вы не посылаете информацию через последовательный порт, чтобы сообщить вашему программному обеспечению, что оно получает, оно не может сказать, где были получены данные; так же как вы не можете сказать, ввел ли я это непосредственно в текстовое поле в моем браузере или загрузил его из базы данных и отправил автоматически.
Если я префикс мое сообщение с какой-то индикатор:
*** Содержимое файла начинается так: "D:\Teset data\ShortTextFile.txt" * * * строка текста * * * содержимое файла заканчивается***
Вы даже не представляете, что "строка теста" пришла из файла или с моей клавиатуры!

Member 12990959

это. saveFileDialog1.Метод showdialog();
Системы.ИО.Файл.WriteAllText(this. saveFileDialog1.Именем, эта.txtData.Текст);


можем ли мы использовать этот код??

OriginalGriff

Я бы не стал.
Похоже, у вас есть два аккаунта, или ваш одноклассник работает над одним и тем же:
https://www.codeproject.com/Answers/1169672/How-do-I-sent-a-text-file-through-serial-port-in-C#answer1
Опять же, сделайте диалог локальной переменной - не включайте его в свой класс.
С любой формой вы должны создать экземпляр, когда хотите его показать, они не очень хорошо реагируют на "повторное использование" после закрытия.

Member 12990959

мы 2 друга работаем над одним и тем же проектом

OriginalGriff

Так поговори с ним!
Он должен дать какое-то указание, что это файл, а не прямой пользовательский ввод, и вы должны понять это указание.

Имейте в виду, что если вы начнете передавать двоичные файлы, а не только текст, вам нужно будет найти способ справиться и с этим - двоичные файлы могут содержать любые значения, поэтому вам нужно будет "упаковать" их так, чтобы они не конфликтовали с вашими конструкциями "типа данных".