Jump to content

    

Эмуляция COM через USB

Господа!

 

Нет ли у кого примеров (если это вообще возможно) реализации в USB CDC устройстве эмуляции сигналов RTS/CTS и DSR/DCS?

 

Заранее благодарю

Share this post


Link to post
Share on other sites

Я сам пока не сталкивался с такой задачей, но знаю, что

на сегодняшний день для организации виртуального COM-порта через USB в России популярны ИМС фирмы FTDI - FT232BM,

FT245BM и др.

Сайт производителя www.ftdichip.com

Сайт официального поставщика www.efo.ru

Share this post


Link to post
Share on other sites

По большому счету это работа специально написанного драйвера (WDM), который делает преобразование USB протокола в аналог работы COM порта - отсюда и его 'виртуальность'.

Share this post


Link to post
Share on other sites

Есть ещё вариант - мост USB - UART CP2101.

Судя по документации сигналы RTS/CTS и DSR/DCS поддерживаются.

В Питере официальный поставщик Электроснаб - www.electrosnab.ru

Share this post


Link to post
Share on other sites

CP2101 не рекомендована производителем для новых разработок. Вместо нее выпускается pin-to-pin compatible CP2102. Есть еще CP2103 с 4-ми доп. GPIO, три из которых могут выполнять автоматически функции управления TX_LED, RX_LED и сигнала DE для драйвера RS485.

см. раздел USB to UART Bridge на сайте SiLabs.

Share this post


Link to post
Share on other sites

Насчет применения специализированных USB контроллеров – дело понятное. Тем более, если сам пишешь драйвер, то можно там что хочешь придумать и реализовать.

 

Наверное я не очень внятно сначала сформулировал свой вопрос. Хотелось на стандартном USB контроллере (мы сейчас используем PDIUSBD12) реализовать CDC устройство и работать с ним через стандартный usbcomm.sys драйвер из Windows’a. Изучение запросов, которые должено обрабатывать CDC устройство, показало, что там таковые (на установку и сброс сигналов DTR и пр.) отсутствуют. Так что похоже это вариант не проходит.

Share this post


Link to post
Share on other sites
Хотелось на стандартном USB контроллере (мы сейчас используем PDIUSBD12) реализовать CDC устройство и работать с ним через стандартный usbcomm.sys драйвер из Windows’a. Изучение запросов, которые должено обрабатывать CDC устройство, показало, что там таковые (на установку и сброс сигналов DTR и пр.) отсутствуют. Так что похоже это вариант не проходит.

 

Я делал CDC устройство на связке ATMega16L + PDIUSBD12. CDC класс поддерживает сигнализацию

DTR/DSR, RTS, DCD, RI и Break (т.е. все, кроме CTS). Если есть заинтересованность, могу

рассказать подробнее.

Share this post


Link to post
Share on other sites

Очень даже интересно. Можно на e-mail : nik_ef@mail.ru

 

Заранее благодарю

Share this post


Link to post
Share on other sites

Используешь так же как и на обычном порте. Только вот проблемы со скоростью возникают медленно это все(((

Share this post


Link to post
Share on other sites
Я делал CDC устройство на связке ATMega16L + PDIUSBD12. CDC класс поддерживает сигнализацию

DTR/DSR, RTS, DCD, RI и Break (т.е. все, кроме CTS). Если есть заинтересованность, могу

рассказать подробнее.

Занялся тоже данной связкой. Собрал, подкорректировал Филиповские исходники - мое устройство видится ОСью, все в порядке. Но

 

ни как не могу открыть мой порт ни одной программой. Вот так его видит USBView:

Device Descriptor:
bcdUSB:             0x0110
bDeviceClass:         0x02
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x10 (16)
idVendor:           0x5555
idProduct:          0x7777
bcdDevice:          0x0001
iManufacturer:        0x01
0x0409: "PROTTOSS"
iProduct:             0x02
0x0409: "PDIUSBD12 test USB device"
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x01
Open Pipes:              3

Endpoint Descriptor:
bEndpointAddress:     0x81  IN
Transfer Type:   Interrupt
wMaxPacketSize:     0x0010 (16)
bInterval:            0x64

Endpoint Descriptor:
bEndpointAddress:     0x02  OUT
Transfer Type:        Bulk
wMaxPacketSize:     0x0010 (16)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x82  IN
Transfer Type:        Bulk
wMaxPacketSize:     0x0010 (16)
bInterval:            0x00

Configuration Descriptor:
wTotalLength:       0x0043
bNumInterfaces:       0x02
bConfigurationValue:  0x01
iConfiguration:       0x00
bmAttributes:         0x80 (Bus Powered )
MaxPower:             0x32 (100 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x01
bInterfaceClass:      0x02
bInterfaceSubClass:   0x02
bInterfaceProtocol:   0x01
iInterface:           0x00

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x05
05 24 00 10 01 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x04
04 24 02 02 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x05
05 24 06 00 01 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x05
05 24 01 03 01 

Endpoint Descriptor:
bEndpointAddress:     0x81  IN
Transfer Type:   Interrupt
wMaxPacketSize:     0x0010 (16)
bInterval:            0x64

Interface Descriptor:
bInterfaceNumber:     0x01
bAlternateSetting:    0x00
bNumEndpoints:        0x02
bInterfaceClass:      0x0A
bInterfaceSubClass:   0x00
bInterfaceProtocol:   0x00
iInterface:           0x00

Endpoint Descriptor:
bEndpointAddress:     0x02  OUT
Transfer Type:        Bulk
wMaxPacketSize:     0x0010 (16)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x82  IN
Transfer Type:        Bulk
wMaxPacketSize:     0x0010 (16)
bInterval:            0x00

Да еще... После энумерации приходит два запроса специфичных для класса: GET_ENCAPSULATED_RESPONSE и SET_COMM_FEATURE. Но я так понимаю их можно игнорировать, что я и делаю...

Share this post


Link to post
Share on other sites

На сайте Atmel есть новый проект - AT91 USB Framework - Core 1.01 + CDC 1.0.zip.

 

Сам в нем пока не разбирался - полно другой работы. Погляди как там реализовано.

Share this post


Link to post
Share on other sites

Все разобрался.... :)

 

 

 

Для начала: я не правильно декодировал запросы, было не

 

GET_ENCAPSULATED_RESPONSE и SET_COMM_FEATURE,

 

 

 

а было

 

GET_LINE_CODING и SET_CONTROL_LINE_STATE

 

 

 

А я их не отрабатывал... Как обычно дело было не в бобине...

Share this post


Link to post
Share on other sites

Чтоб не поднимать новую тему продолжу здесь ибо все равно она касается заголовка темы:

решил я пойти дальше, а именно сделать два девайса в одном, то бишь два моста USB - RS232...

Составил дескрипторы как положено - ОС определила составное устройство - далее потребовало дрова для устройств в него входящих, подсунул ей свой инф где прописанны оба интерфейса - взяла - установила дрова, но вот для второго устройста пожаловалось, что:

"Запуск этого устройства невозможен. (Код 10)" :( ...

 

Кроме того, после инсталяции в setupapi.log появилась запись для второго интерфейса вида:

"Устройство не запущено: обнаружена проблема: 0x0a: CM_PROB_FAILED_START".

 

Может быть кто знает, куда копать. Неохота самому писать собственный драйвер :)

Спасибо

Share this post


Link to post
Share on other sites
Кроме того, после инсталяции в setupapi.log появилась запись для второго интерфейса вида:

"Устройство не запущено: обнаружена проблема: 0x0a: CM_PROB_FAILED_START".

 

Может быть кто знает, куда копать. Неохота самому писать собственный драйвер :)

Спасибо

Недавно где-то здесь же на форуме промелькнула информация о схожей проблеме и о том, сколько реально нужно endpoints для реализации двух CDC в одном устройстве. Поищите.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this