Форум программистов, компьютерный форум, киберфорум
Наши страницы

КИП, датчики

Войти
Регистрация
Восстановить пароль
 
Pal4
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 15
#1

Приём большого массива данных через COMport - КИП, датчики

06.12.2013, 19:22. Просмотров 770. Ответов 8
Метки нет (Все метки)

Есть МК, по команде с компьютера он в ответ отправляет 32772 байт. Вопрос, как лучше принимать данные, чтоб ничего не потерять. Скорость интерфейса RS232 115200 бод. Стоп бит – 1. Четность – нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2013, 19:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приём большого массива данных через COMport (КИП, датчики):

Некорректный вывод данных через comport Delphi 7 - Arduino
Хай! Как показано на картинке вывод данных через com порт программы Arduino и программы Delphi немного не корректны. В чем может быть...

Некорректный вывод данных через comport Delphi 7 - Arduino - Delphi
Хай! Как показано на картинке вывод данных через com порт программы Arduino и программы Delphi немного не корректны. В чем может быть...

Приём данных через Bluetooth - Xamarin
Как правильно принимать данные через bluetooth? Соединение устанавливать я умею. Интересует именно сам процесс получения данных....

Передача и приём данных через COM порт - Delphi
Задача такая, нужно через ком порт передавать и принимать пачки байтов, всё это по протоколу modbus rtu. Установил библиотеки ком порта...

Передача и приём данных через COM-порт - C++ WinAPI
Добрый день! Передо мной поставили задачу написать программу для работы с адаптером OBD2 Elm327 через виртуальный COM-порт. Пробую пока...

Приём данных через компонент serialport - Visual C++
Доброго времени суток, подскажите. каким образом осуществляется чтение данных с ком порта посредством данного компонента? У serialport есть...

8
nb-np
47 / 47 / 5
Регистрация: 18.11.2013
Сообщений: 92
06.12.2013, 22:21 #2
а отправляет как, последовательно без пауз? протокол предусматривает начало/конец посылки, таймауты, еще что нибудь, или это просто 32к "плевков" по уарту?)
0
raxp
10165 / 6551 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
07.12.2013, 02:03 #3
...у вас TC неправильный вопрос, правильный - как лучше передавать? Если вы сами реализуете. Хотя бы простейшим протоколом с коррекцией хотя-бы одной ошибки, т.е. наличием CRC.

Если же не сами передаете, а чужое, тогда вопрос "как принимать?" нужно адресовать разработчику той "передачи", а точнее документации, о которой почему-то вы умалчиваете. Ферштеен?
1
paskal
445 / 294 / 26
Регистрация: 15.08.2011
Сообщений: 878
07.12.2013, 12:54 #4
Цитата Сообщение от Pal4 Посмотреть сообщение
по команде с компьютера он в ответ отправляет 32772 байт. Вопрос, как лучше принимать данные, чтоб ничего не потерять.
Увеличить размер приемного буфера. Если вы работаете под win, то это функция SetupComm. В идеале, надо чтоб размер был 32772. Если получится.
А еще отправлять 2 стоп бита не мешало бы. Хотя бы потому что частоты приемника и передатчика обязательно чуть-чуть не совпадают.

Добавлено через 13 минут
А вообще мне случалось была задача принимать много-много мегабайт непрерывным потоком на скорости 921 600 (т.е. в 8 раз выше вашей) через конвертер USB-COM. И вроде явных признаков потерь данных не было. Хотя я даже с размером буфера не заморачивался, оставил как есть по умолчанию.
Так что я думаю с вашими какими то 32k боятся особо нечего
1
Pal4
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 15
07.12.2013, 13:52  [ТС] #5
По протоколу я принимаю в одном пакете 2 байта - код команды, потом 2 байта - кол-во байтов данных которые будут переданы, потом собственно данные.

Работаю тоже через usb-com конвертер, думаю на него, но не уверен. Да и задача стоит, чтоб работало и через конвертер.

В отладке смотрю что он принимает: первый байт команды, потом 3 нулевых байта, потом 2 байт команды... уже видно, что не так как-то всё) И потом я вижу что программа уже всё обработала, а осциллограф ещё показывает, что данные идут. То-есть считывать как-то умудряется нули, между передоваемыми байтами. Через терминальную программу пробую всё нормально. То есть проблема где-то с приёмом. И думаю зря перенесли из темы .NET, тк интересуют тонкости работы с SerialPort, особенно когда работа осуществляется через конвертер usb-com.

Добавлено через 1 минуту
Да и реализую программу для МК не сам, но как сказал терминальная программа всё принимает как надо, значит проблема где-то у меня с приёмом.
0
raxp
10165 / 6551 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
07.12.2013, 14:01 #6
...терминальная программа не показатель. Условия лабораторные или все же удаленно в условиях длинной линии с помехами?

По протоколу я принимаю в одном пакете 2 байта - код команды, потом 2 байта - кол-во байтов данных которые будут переданы, потом собственно данные.
т.е. нет даже CRC, плохо. Описание протокола тоже отсутствует.

То есть проблема где-то с приёмом. И думаю зря перенесли из темы .NET, тк интересуют тонкости работы с SerialPort,
SerialPORT - обертка над WinAPI вызовами и неважно из чего вы работаете. Посмотрите окружающие темы КИП, тут много примеров с C#. Да и пока нет ни строчки кода от вас, как вы осуществляете прием, так что говорить вообще не чем в контексте C#.

Пример Получение данных с ридера карт PERCo-IR05

особенно когда работа осуществляется через конвертер usb-com.
это вообще теплое с мягким путаете, это железные тонкости. Какой именно конвертор, на каком чипе? Исходите из его возможностей в даташите.
1
Voland_
1447 / 950 / 91
Регистрация: 04.01.2010
Сообщений: 3,070
09.12.2013, 20:02 #7
Pal4, все придумано до нас: Xmodem для AVR. Контроль четности, пакеты, подтверждение. Простенько и со вкусом.
Цитата Сообщение от paskal Посмотреть сообщение
А еще отправлять 2 стоп бита не мешало бы. Хотя бы потому что частоты приемника и передатчика обязательно чуть-чуть не совпадают.
Синхронизация схемы происходит в пределах каждого байта - в момент появления старт-бита на шине. Так что второй стоп-бит ничего в этом плане не даст. Доп.защиту от потери даст бит четности, но к сожалению, от не проконтролирует потерю целого байта. Что очень наудобно. Эта же ситуация возникает и тогда, когда используются алгоритмы восстановления данных (Хемминг, Рид-Соломон). В случае их использования уж лучше бы бит-два были неправильными, чем потеря байта.
0
paskal
445 / 294 / 26
Регистрация: 15.08.2011
Сообщений: 878
10.12.2013, 21:00 #8
Цитата Сообщение от Voland_ Посмотреть сообщение
Синхронизация схемы происходит в пределах каждого байта - в момент появления старт-бита на шине. Так что второй стоп-бит ничего в этом плане не даст.
Ну насчет "ничего не даст" возникает логичный вопрос: а зачем этот второй стоп бит нужен? Ведь он не несет никакой информационной нагрузки.
На самом деле синхронизация происходит чуть сложнее чем вы написали. Да синхронизация по старт-биту... Но после того как закончится вся предидущая посылка включая стоп-бит. Если новый старт бит придет раньше, то синхронизация не начнется.
А такая ситуация например, бывает при непрерывном потоке посылок когда приемник работает чуть медленнее передатчика. Передатчик уже закончил отправку стоп бита, начал следующий старт, а приемник еще отсчитывает предидущий стоп-бит, на старт не реагирует. Вот тут и помогает второй стоп-бит.
0
Voland_
11.12.2013, 00:16     Приём большого массива данных через COMport
  #9

Не по теме:

paskal, синхронизация не происходит по стоп-биту. Она происходит по старт-биту. Приемник по приему стоп-бита лишь проверит - есть там единица или нет и выставит флаг ошибки, если на шине будет единица...
Так что приемник "не ждет" стоп-бит, как вы тут пишете:

Цитата Сообщение от paskal Посмотреть сообщение
Но после того как
Есть автоподстраиваемые чипы, но они опираются на любой переход в данных, а не только стоп-бит. Но речь не о них.

Второе - если рассинхронизация такая, что требуется второй бит, то последний принятый бит полезных данных (а может и не только) - принят будет неправильно. А именно вместо последнего бита будет принят стоп-бит, или "ноль". И хорошо, если только один. Так что толку от того, что вы примете байт, но неправильный - тоже не много. Разве что как раз для случаев использования алгоритмов восстановления, о которых я говорил.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2013, 00:16
Привет! Вот еще темы с ответами:

Вывести текст через программу в Delphi через COMPort на бегущую строку - Delphi
Доброго времени суток, форумчане! Дали задание вывести через COMPort текст на табло(бегущую строку) текста. И тут я столкнулся с...

Отправка большого количества данных через сокет - C++ Qt
Есть вектор, содержащий в себе QString с названиями текущих запущенных процессов. Необходимо передать этот вектор (его содержание) через...

Сохранение в файл большого количества картинок и данных через STREAM - Delphi
Все привет. Есть много данных (integer, string) и картинки (bitmap). Задача сохранить скопом все - и данные и картинки в один файл, а...

График большого массива данных - Matlab
Всем привет, такой вопрос, имеется большой массив данных в виде бинарного файла, я его считываю в Matlab с помощью команды fopen и fread, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
11.12.2013, 00:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru