Страница 1 из 1

прием пакетов различной длины с COM-порта

Добавлено: 16 окт 2018, 08:58
powerf12
Добрый день!
Есть проблема.

Принцип программы - на железку отправляю 9 байт, эти же 9 байт я получаю обратно (мол пакет цел).

Отправляю в ком-порт 9 байт, считываю 9 байт (указываю byte count 9 в VISA Read Function ), все без проблем (вопрос-ответ).
на один из пакетов (запрос данных с датчиков) я получаю пакет 50 байт(указываю byte count 9(пакет) + 50(данные с датчиков) в VISA Read Function ), тоже все без проблем. (вопрос-ответ + информация с датчиков)

Но, когда я отправлю в ком-порт снова пакет из 9 байт я могу получить 9 байт , среди которых будет половина данных с датчиков. иногда получаю тот же пакет , который и отправил)

Есть подозрение, что данные не очищаются в буфере labview ком-порта, так как если тестить через terminal, или через Comm Operator Pal , то никаких проблем с повторной отправкой нет)

Re: прием пакетов различной длины с COM-порта

Добавлено: 16 окт 2018, 09:40
Vitekkz88
Да вы где-то сами эти данные буферизируете, исходники покажите. Какая очистка буфера? Сделайте её(очистку) самостоятельно, если такие проблемы: VISA Flush I/O Buffer Function .

Re: прием пакетов различной длины с COM-порта

Добавлено: 16 окт 2018, 11:45
Borjomy_1
Приемный буфер ВСЕГДА очищается при вычитывании. Если там есть еще данные, значит они были приняты дополнительно.
Очищать входной буфер - последнее дело. Надо разбираться, почему железка оправляет пакет на запрос данных с датчиков повторно. Учтите, что через терминал вы отправляете команды с большими промежутками. Выставьте в настройках драйвера последовательного порта размер FIFO буфера равный 1. Тогда не будет задержек прихода данных в буфер (т.к пакет не кратен размеру буфера, задержка может составлять 55мс, в некоторых случаях это критично, особенно для систем запрос-ответ)

Re: прием пакетов различной длины с COM-порта

Добавлено: 16 окт 2018, 13:28
powerf12
Borjomy_1, Vitekkz88,

на осциллографе 1 пакет прилетает обратно)

добавил VISA Flush I/O Buffer Function, все заработало

Re: прием пакетов различной длины с COM-порта

Добавлено: 16 окт 2018, 13:59
Borjomy_1
на осциллографе 1 пакет прилетает обратно)
ну так вычитывайте его! Зачем буфер очищать? Тем более после отправки команды. А если процесс в это время притормозит, то буфер очистится и от принятого пакета. Зачем подлянки себе устраивать?

Re: прием пакетов различной длины с COM-порта

Добавлено: 16 окт 2018, 15:01
powerf12
Borjomy_1, прошу прощения, не так выразился )

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

то есть если не добавить VISA Flush I/O Buffer Function, то данные в программе считываются иногда повторно при отправке другой команды.

Re: прием пакетов различной длины с COM-порта

Добавлено: 16 окт 2018, 15:10
Borjomy_1
Не могут они повторно считываться из буфера. Ни у кого они не считываются, а у вас считываются, как странно. Не находите?
Вы в одном месте обращаетесь к железке с запросом или в разных? Так вот если в разных, то один поток посылает одну команду, другой посылает вторую команду, а чтение из буфера срабатывает первым у того, у кого запрос на считывание короче (меньше байт). Вот и все. Чтобы такого не происходило,нужно обмен с контроллером вставить в один VI. Тогда запросы будут выполняться строго последовательно, независимо от того, из какого потока они вызваны.

Re: прием пакетов различной длины с COM-порта

Добавлено: 16 окт 2018, 21:31
powerf12
Borjomy_1,
Вы в одном месте обращаетесь к железке с запросом или в разных?
в одном.

при отправке команды я получаю в ответ саму команду и данные с датчиков.

Re: прием пакетов различной длины с COM-порта

Добавлено: 17 окт 2018, 06:36
Vitekkz88
powerf12, давайте попробуем разобраться с этой проблемой.
Откройте пример Help -> Find Examples -> Simple Serial. Величину задержки установите в 500 мс. Посмотрите, какой объем информации у Вас будет приходить при различных задержках. Затем, вместо Bytes at Port используйте реальное число байт, которое ожидается в ответе.
Вы просто где-то просчитались с байтами и читаете меньшее количество, а ошмётки прошлого запроса вычитываете при следующем запросе.

Re: прием пакетов различной длины с COM-порта

Добавлено: 17 окт 2018, 12:42
dadreamer
powerf12, также проверьте работу прибора в этом :vi: . Установите на БД параметры порта, отправляйте посылки и смотрите, что приходит в ответ - будут ли дублироваться пакеты и появится ли какой-то посторонний "мусор". Отправлять числа можете в HEX - переключите Display Style у контрола "Выход", нажав ЛКМ (инструмент "рука") на серой полоске контрола и выбрав Hex Display. Кроме того, как вам уже советовали, надо подумать о структуре посылки, а также предусмотреть использование терминатора (терминального байта), что значительно облегчит разделение принятых посылок и парсинг данных.