Вот Borjomy_1 правильно понял мою проблему. С передачей байт как таковых проблем нет. Просто я новичок в "картиночном программировании" и никак не могу сообразить, как пропустить ненужные байты, если в момент запуска прибора выясняется, что датчик 3 байта уже заслал. Следующие 6 байт то нужно пропустить и начать прием с новой посылки. В обычном программировании я могу завести переменную, которая будет хранить состояние автомата, могу по совпадению с старт-байтом обнулить индекс массива и начать его заполнение следующими байтами и тд и тп. А тут никак не пойму, как это организовать.
В принципе сейчас допетрил, как в полученных 9 байтах отыскать старт-байт и провернуть массив до нужной последовательности, но в этой ситуации получается, что данные, разделенные старт-байтом, принадлежат двум хоть и "соседним", но разным измерениям, что тоже не очень хорошо.
Потеря байт при работе с COM портом
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Потеря байт при работе с COM портом
Ситуация стара, как мир. Есть ноутбук, к которому подключается датчик через конвертер USB-RS-422. Система полевая, не лабораторная. Человек, который ее эксплуатирует тоже, не компьютерный гуру. Требуется, чтобы в любой момент датчик можно было подключить или отключить. Перезагружать ноутбук, если последовательность действий была произведена в другом порядке? Глупость, да и не предусмотрено закрытие сессии VISA при отключении датчика. Программа повисает на VISA Read, когда отключают конвертер от USB порта (при заданных таймаутах 200мс). Может не повиснуть, но потом при подключении порт не открыть, либо порт будет другой. При первом подключении после включении целевой системы порт может быть, например, либо COM3, либо COM4.Я что-то такого тоже не встречал. Хотя я, может, и не так много работал с Prolific'ом. Отключаете модуль, тупо выдергивая из USB-порта? Или до этого программно закрываете все сеансы, потом выдёргиваете? И когда снова вставляете, то ... устройство не определяется / к нему нельзя подключиться / пакеты пропадают / ?..
Ну, допустим, если используется всё время FTDI, разъём один и тот же и COM-порт получаем один и тот же, то можно ничего не искать. Однако не будет гибкости и универсальности.
Когда при подключении преобразователя появляется соответствующий - гуда уж гибче? Все, что от преобразователя требуется - это виртуальный порт, с которым можно работать через API и который один и тот-же при подключении.
Это не так. Просто драйвер есть на сайте микрософта и подгружается автоматически. Только если вы пошерстите соответствующие форумы, то увидите, что, в отличие от FTDI, Prolific требует танцев с бубнами, если не заработал сразу, поскольку штатный драйвер и микросовтовский друг друга не заменяют, второй надо удалять ручками.А еще Prolific - это пока единственная микросхема, которая не потребовала драйверов для работы в системе(разумеется из тех, с которыми я работал).
А вы не в курсе, что это могли быть китайские клоны? Тамошние товарищи скопировали этот чип, но что-то там не доделали.. А вы, небось, по дешевке купили партию и порадовались.пришла партия преобразователей на базе FT232R - FTDI. Среди рабочих были и такие, которые не обеспечивали даже 115200(частота была в гораздо меньшую сторону). Проверяли осциллографом.
Еще очень важная причина отказа от Prolifica в том, что он у нас зависал при непрерывной работе (с максимальной загрузкой канала на скорости 115200) в течение нескольких суток. Требуя при этом для восстановления работоспособности чуть ли не перезапуска целевой системы. Производитель преобразователя (коробочки) тут не причем, мы перепробовали нескольких. Для нас это недопустимо.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Потеря байт при работе с COM портом
Итак у вас 9 байт в посылкеСледующие 6 байт то нужно пропустить и начать прием с новой посылки. В обычном программировании я могу завести переменную, которая будет хранить состояние автомата, могу по совпадению с старт-байтом обнулить индекс массива и начать его заполнение следующими байтами и тд и тп. А тут никак не пойму, как это организовать.
Считываете 18 байт разом. Ищете в этой строке стартовый байт (или начало посылки, если байт несколько). Предположим, начало посылки у вас идет 3 байтом. Получаем, что надо будет вычитать еще 3 байта (хвост второй целой посылки). Можете их выбросить, можете использовать - как хотите. Но после этой операции в буфере будут лежать посылки, начинающиеся со стартового байта. Их уже можно вычитывать, ориентируясь только по размеру посылки. Если у вас есть сомнения, что стартовый байт найден правильно, то при приеме уже синхронизированных посылок проверяйте начало посылки, если не соответствует заданному, заново запускайте синхронизацию, предварительно считав один байт из буфера, таким образом запуская поиск со смещением.
-
- interested
- Сообщения: 5
- Зарегистрирован: 14 янв 2016, 22:13
- Версия LabVIEW: 2015
- Контактная информация:
Re: Потеря байт при работе с COM портом
Borjomy_1, Спасибо за разъяснения, но на пальцах это все более чем понятно. Вы не могли бы подсказать, какие картинки для этого использовать и как. Я не понимаю, мы же заказываем функцией VISA read 9 байт, получаем мы их все сразу и только потом можем разобраться, есть ли смещение в посылке или нет. Определять это, а также на сколько смещен старт-байт, я научился. Никак не пойму, как заставить функцию VISA read в следующий раз пропустить ненужные байты и выдать строку в той последовательности, в которой нужно.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Потеря байт при работе с COM портом
Сессия остаётся висеть и порт занят. То есть, нужно так или иначе закрыть сессию VISA и освободить ресурсы. Вот здесь я предложил использовать инструмент VISA Close with Abort и это помогло. Но поскольку у вас вообще программа виснет, то остаётся закрытие сессии вручную. В настройках поставьте галку Tools -> Options -> Environment -> Automatically close VISA sessions (в файле параметров опция имеет вид cleanupVisa=True). В таком случае сессия будет закрываться при нажатии на Abort. Вот ещё полезный инструмент: C:\Program Files (x86)\National Instruments\LabVIEW 2011\vi.lib\Utility\visa.llb\Open VISA Session Monitor.vi. Позволяет просмотреть список открытых сессий и вручную закрыть выбранные.Borjomy_1 писал(а):Ситуация стара, как мир. Есть ноутбук, к которому подключается датчик через конвертер USB-RS-422. Система полевая, не лабораторная. Человек, который ее эксплуатирует тоже, не компьютерный гуру. Требуется, чтобы в любой момент датчик можно было подключить или отключить. Перезагружать ноутбук, если последовательность действий была произведена в другом порядке? Глупость, да и не предусмотрено закрытие сессии VISA при отключении датчика. Программа повисает на VISA Read, когда отключают конвертер от USB порта (при заданных таймаутах 200мс). Может не повиснуть, но потом при подключении порт не открыть, либо порт будет другой. При первом подключении после включении целевой системы порт может быть, например, либо COM3, либо COM4.
Ну, или возможны вариации "на тему". Например, отдельный поток/процесс, который следит за тем, что преобразователь был извлечён и через некоторое время рвёт сессию/убивает процесс. Можете развить детальнее, если есть желание.
Гибче в том плане, чтоBorjomy_1 писал(а):Когда при подключении преобразователя появляется соответствующий - гуда уж гибче? Все, что от преобразователя требуется - это виртуальный порт, с которым можно работать через API и который один и тот-же при подключении.
То есть, программе было бы "по барабану", с каким преобразователем работать - она могла бы работать с любым без потери эффективности.dadreamer писал(а):можно было бы заменить один адаптер на другой (с теми же настройками порта) и разницы не почувствовать.
Бывает такое прямо с теми же данными чипа (маркировка, серийник и т.п.)? Обычно клоны имеют свои имена, да и часто драйвер у них свой. Ну, из тех, что видел. А FTDI чипы разве не в Китае делает? Вряд ли в Шотландии.Borjomy_1 писал(а):А вы не в курсе, что это могли быть китайские клоны? Тамошние товарищи скопировали этот чип, но что-то там не доделали.. А вы, небось, по дешевке купили партию и порадовались.
Vitekkz88 писал(а):Вот Вам для общего развития: http://habrahabr.ru/company/zeptobars/blog/212859/ .
Интересно, надо будет проверить, как будет такая возможность.Borjomy_1 писал(а):Еще очень важная причина отказа от Prolifica в том, что он у нас зависал при непрерывной работе (с максимальной загрузкой канала на скорости 115200) в течение нескольких суток.
Последний раз редактировалось dadreamer 16 янв 2016, 16:07, всего редактировалось 1 раз.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Потеря байт при работе с COM портом
Все одинаково легко и просто устанавливается/исправляется как для FTDI так и для Prolific. Не надо жути нагонять.Borjomy_1 писал(а):в отличие от FTDI, Prolific требует танцев с бубнами, если не заработал сразу, поскольку штатный драйвер и микросовтовский друг друга не заменяют, второй надо удалять ручками.
Вкурсе, но это были не китайские клоны. Может у Вас в компании принято на рынках по дешевке закупаться оборудованием или микросхемами, но мы ведем закупки иначе - не надо всех под одну гребенку. Более того, Китай от НЕ Китая легко отличить. Вот Вам для общего развития: http://habrahabr.ru/company/zeptobars/blog/212859/ .Borjomy_1 писал(а):А вы не в курсе, что это могли быть китайские клоны? Тамошние товарищи скопировали этот чип, но что-то там не доделали.. А вы, небось, по дешевке купили партию и порадовались.
Не знаю, как там с круглосуточной работай через LabVIEW - но с Си-шной реализацией приёма данных(терминал специальный)- проблем не было. Тем не менее - Ваш горький опыт и профанации с Prolific-ом могут заставить призадуматься. Меня проблемы зависания и чего-то еще в процессе работы обходили стороной.Borjomy_1 писал(а):Еще очень важная причина отказа от Prolifica в том, что он у нас зависал при непрерывной работе (с максимальной загрузкой канала на скорости 115200) в течение нескольких суток.
dadreamer, заодно и С/C++ реализацию можете потестить(если есть конечно). У меня закрались подозрения, что VISA глючила, а не преобразователь.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Потеря байт при работе с COM портом
Я бы не сказал, что китай от некитая легко отличить, тем более в таком случае как с FTDI. Освоят китайцы лазерную гравировку и что делать.... А брак, ну да, бывает. Мы также сталкивались с тем, что бывают бракованные партии например процессорных плат у производителей, от которых такого никак не ожидать.Вкурсе, но это были не китайские клоны. Может у Вас в компании принято на рынках по дешевке закупаться оборудованием или микросхемами, но мы ведем закупки иначе - не надо всех под одну гребенку. Более того, Китай от НЕ Китая легко отличить.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Потеря байт при работе с COM портом
Проще применить конвертер на другом чипсете. Лично у меня на старости лет развивается аллергия на "делание из д..ма конфетки". Накушался.Сессия остаётся висеть и порт занят. То есть, нужно так или иначе закрыть сессию VISA и освободить ресурсы. Вот здесь я предложил использовать инструмент VISA Close with Abort и это помогло. Но поскольку у вас вообще программа виснет, то остаётся закрытие сессии вручную. В настройках поставьте галку Tools -> Options -> Environment -> Automatically close VISA sessions (в файле параметров опция имеет вид cleanupVisa=True). В таком случае сессия будет закрываться при нажатии на Abort. Вот ещё полезный инструмент: C:\Program Files (x86)\National Instruments\LabVIEW 2011\vi.lib\Utility\visa.llb\Open VISA Session Monitor.vi. Позволяет просмотреть список открытых сессий и вручную закрыть выбранные.
Ну, или возможны вариации "на тему". Например, отдельный поток/процесс, который следит за тем, что преобразователь был извлечён и через некоторое время рвёт сессию/убивает процесс. Можете развить детальнее, если есть желание.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Потеря байт при работе с COM портом
Для того чтобы заставить VISA read в следующий раз пропустить ненужные байты, достаточно заказать чтение количества этих ненужных байт. Функция выполнится и выдаст вам эти ненужные данные. А вы ее обманите и не обрабатывайте их. Что тут сложного?sirQWERTY писал(а):Borjomy_1, Спасибо за разъяснения, но на пальцах это все более чем понятно. Вы не могли бы подсказать, какие картинки для этого использовать и как. Я не понимаю, мы же заказываем функцией VISA read 9 байт, получаем мы их все сразу и только потом можем разобраться, есть ли смещение в посылке или нет. Определять это, а также на сколько смещен старт-байт, я научился. Никак не пойму, как заставить функцию VISA read в следующий раз пропустить ненужные байты и выдать строку в той последовательности, в которой нужно.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 19 Ответы
- 5223 Просмотры
-
Последнее сообщение jane_wild
-
- 23 Ответы
- 4626 Просмотры
-
Последнее сообщение maxim_MA
-
- 6 Ответы
- 1643 Просмотры
-
Последнее сообщение ladik
-
- 38 Ответы
- 13300 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 2 Ответы
- 270 Просмотры
-
Последнее сообщение Optoelectronics