реклама на сайте
подробности

 
 
> Вопрос по USB CDC
andrewlekar
сообщение Nov 16 2012, 08:10
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Сейчас у нас штатно используется COM порт таким образом: софт открывает порт и общается с железом. Если железка перезапускается или просто физически выткнута из порта и воткнута обратно, то ничего страшного не происходит - обмен продолжается с момента подключения железки обратно.
Теперь хотим перетащить железку на USB, сделали USB CDC - всё работает прекрасно. Но если железку рестартануть, то она не может создать уже открытый в софте порт и обмена не происходит. Неужели USB CDC не предназначен для работы в таких условиях? Сделать что-то можно?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
kovigor
сообщение Nov 16 2012, 08:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(andrewlekar @ Nov 16 2012, 11:10) *
Сделать что-то можно?

Если нужна надежность, то о USB лучше сразу забыть. Только настоящий COM - порт на материнке или мультипортовке ...
P.S. У меня вообще создалось впечатление, что USB подходит только для систем с оператором. Например, завис в офисе принтер. Ну и что ? Подошла секретарша и передернула разъем. А вот для систем, которые должны работать автономно, USB не годится ...
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 16 2012, 08:58
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Ну USB у нас как дополнительный функционал - не основной. Всё же хочется, чтобы пусть и не сильно надёжно, но хотя бы идентично стандартному COM порту работало.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 16 2012, 10:17
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Nov 16 2012, 10:18
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата
Сделать что-то можно?


а) контора Thesycon делает свой собственный драйвер CDC. Там есть возможность сохранять виртуальный ком-порт при пропадании устройства. (если что - полной версии у меня нету).
б) видел рекомендации отпускать хэнд ком-порта при пропадании устройства, а потом пытаться открыть его обратно. Но это либо не работает совсем, либо наши программисты сделали всё неправильно sm.gif
Грабля от MS: если проделывать эти манипуляции после того, как устройство подключилось обратно, работать ничего не будет - не получится открыть хэндл. Закрывать надо перед тем, как устройство появится обратно.
в) можно перезапускать драйвер CDC. Тоже не самый прямой способ (довольно медленно, требует админских прав).


Всё вышесказанное - в предположении, что используется Windows.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 16 2012, 10:21
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (kovigor @ Nov 16 2012, 10:51) *
Например, завис в офисе принтер.
Вот что у нашей секретарши принтер включен в сервер через USB и работает круглосуточно, что у меня к машине принтер подключен по USB, машина не выключается уже три года и лишь перегружается примерно раз в месяц когда Биллины обновления скопом ставлю, вот ни ей ни мне за все это время ни разу не приходилось передергивать разъем. Что мы делаем не так?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 16 2012, 10:30
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Цитата
контора Thesycon делает свой собственный драйвер CDC.

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

Может быть и сработает, но со стороны устройства останется проблема - если есть открытый порт с его номером, то у него енумерация криво проходит. Наверное чинится повторными енумерациями в цикле, но пробовать надо.
Go to the top of the page
 
+Quote Post
Flexz
сообщение Nov 16 2012, 11:54
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Цитата(kovigor @ Nov 16 2012, 12:51) *
Если нужна надежность, то о USB лучше сразу забыть. Только настоящий COM - порт на материнке или мультипортовке ...

Ну не так уж категорично, лучше сказать "если нужна надежность то о USB-CDC лучше сразу забыть" sm.gif
В свое время хватило косяков с ним связанных, начиная от "отваливания" порта и кончая бсодами. Лучше сразу взять libusb - потратить немного времени на изучение, и забыть CDC как страшный сон. С libusb потеря/восстановление связи отрабатываются без проблем (получили таймаут или ошибку - закрываем порт, ждем когда наш девайс пройдет энумерацию, подключаемся снова).
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 16 2012, 16:36
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Flexz @ Nov 16 2012, 13:54) *
Лучше сразу взять libusb
Тогда уж лучше libusbx, как развивающееся продолжение libusb. Но это ставит крест на совместимости софта со старыми устройствами, подключающимися через "железный" COM.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
=AK=
сообщение Nov 17 2012, 10:12
Сообщение #10


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(andrewlekar @ Nov 16 2012, 18:40) *
Но если железку рестартануть, то она не может создать уже открытый в софте порт и обмена не происходит. Неужели USB CDC не предназначен для работы в таких условиях? Сделать что-то можно?

CDC ни причем. Проблема в самой винде, иногда она отмечает устройство как "мертвое", после этого приходится выдернуть устройство из USB и воткнуть снова, тогда винда его заново обнюхает и воспримет.

Реальная проблема с CDC состоит в том, что в виндовом драйвере класса сидит тупой детский баг - при передаче массивов длиной более 8 кбайт данные рано или поздно испортятся. А вот драйвер Thesycon работает правильно, с его помощью можно качать массивы любой длины, я проверял.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 18 2012, 11:42
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Есть мысль переделать на USB-HID, а COM порт реализовать утилитой снаружи. Как на такой вариант смотрите? Будет не очень шустро, но мне достаточно будет 19200 или около того.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Nov 19 2012, 10:21
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Сергей Борщ @ Nov 16 2012, 20:36) *
Тогда уж лучше libusbx, как развивающееся продолжение libusb.

Там вроде б только бэкэнд к "старому" libusb или новому WinUsb от Microsoft.
Надо будет порыть эту тему...


Вообще, кто какие протоколы поверх USB использует? CDC, действительно, работает... неидеально.
Просто создать своё собственное устройство, вне стандарта, и работать напрямую с bulk'ами?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 21 2012, 05:31
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Цитата
Просто создать своё собственное устройство, вне стандарта, и работать напрямую с bulk'ами?

Я решил делать поверх HID устройства. Без драйверов - утилитой буду создавать вирутальный COM порт и эмулировать обмен. Исходники выложу, когда будет всё готово - может кому пригодится.

Я вот только не пойму, если правда присутствует проблема открытия занятого приложением порта, то как сделано общение USB 3G модема с PPP дозвонщиком, например от Мегафона? Если при открытой сессии выдернуть свисток и воткнуть заново он ведь нормально запустится? Или приложение успевает закрыть порт до повторной энумерации?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 09:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016