Member 12990959 Ответов: 2

Я не получаю полные данные, когда мы отправляем текстовый файл через последовательный порт c#..?


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

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

    this.txtfile.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.txtfile.Text));
}



private void save_Click(object sender, EventArgs e)
{

    this.saveFileDialog1.ShowDialog();
    System.IO.File.WriteAllText(this.saveFileDialog1.FileName, this.txtData1.Text);
}


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

последовательный порт подключен как петля назад

2 Ответов

Рейтинг:
2

OriginalGriff

Как я объяснил вчера:

Цитата:
И кстати: последовательные порты не являются мгновенными. Передача данных занимает много времени, поэтому использование ReadExisting может не дать вам всего сообщения за один раз!
То же самое относится и к ReadAllText - система не "знает", когда файл начинается и заканчивается, это просто данные в последовательный порт. Поэтому вам нужно "упаковать" информацию так, чтобы ваше отправляющее и принимающее программное обеспечение работало вместе. Вы не можете просто пойти "отправить" и предположить, что все это делается мгновенно для вас с помощью магии! :смеяться:


Richard MacCutchan

Ты хочешь сказать, что это не делается с помощью магии? Кто знает?

Member 12990959

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

OriginalGriff

На самом деле нет - время, необходимое для отправки "образца", зависит от двух вещей: размера образца в байтах (который не обязательно совпадает с размером в символах) и скорости передачи данных последовательного порта. Поэтому, если приемник не знает приблизительного размера данных, которые он должен получить, он вообще не может установить "разумное" время!

Помните, что скорость передачи данных выражается в битах в секунду (а не в символах в секунду) и является максимальной скоростью, с которой могут передаваться символы (и что каждый символ имеет количество "упаковочных" битов, как указано в настройках start, stop и parity bit порта).
9600 бод в лучшем случае равняется примерно 1000 символам в секунду, реальные результаты могут быть значительно ниже этого!

Вам действительно лучше "делать это правильно"с самого начала - вы двое роете себе большие ямы, пытаясь обойти это!

0x01AA

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

Member 12990959

теперь я могу отправить полный файл за один раз, я хочу отправить 24 байта данных за 2,5 МС, возможно ли это?? не могли бы вы поделиться кодом для расширения вышеуказанного кода

Спасибо

OriginalGriff

"не могли бы вы поделиться кодом для расширения вышеуказанного кода"
Нет, мы здесь не для того, чтобы делать за вас вашу работу!
Это возможно - вероятно, - но здесь есть вещи, работающие против вас: Windows не является операционной системой реального времени, поэтому точное время не может быть гарантировано. А класс Timer имеет то же разрешение, что и часы Windows, поэтому любые значения, которые не кратны 15 мс (или, в частности, меньше 15 мс), вероятно, не произойдут, когда вы думаете, что они произойдут - это зависит от вашего оборудования!
Кроме того, свойство Timer class Interval-это целое число миллисекунд, поэтому вы вообще не можете установить его равным 2,5!
Но если вы установите таймер в своем приложении с интервалом 3 и используете событие Tick для отправки ваших байтов, вы можете увидеть, что произойдет.

Member 12990959

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

OriginalGriff

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

Рейтинг:
0

Patrice T

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

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

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


0x01AA

Неплохая пятерка. Не хватает только одного слова о рукопожатии ;)

Patrice T

Спасибо.
Не хотелось вдаваться в подробности.

Member 12990959

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

Кстати, я хочу отправить 24 байта за 2,5 МС точно так же следующие 24 байта в следующие 2,5 мс можно отправить вот так.?? если возможно, не могли бы вы объяснить, как или поделиться этим кодом здесь

заранее спасибо

Patrice T

какова скорость вашего последовательного порта ?