Главная » Delphi » Эмуляция СОМ-порта через шину USB

16

Еще не так давно считалось, что протокол обмена данными по USB настолько сложен, что его реализовать под силу только далеко не рядовым специалистам. Но спрос рождает предложение. Вероятно, самое удобное на сегодняшний день решение для эмуляции последовательного порта через USB предлагает английская (точнее шотландская) фирма Future Technology Devices International Ltd — FTDI. К ее устройствам (см. также приложение 4) прилагаются бесплатные и свободно распространяемые драйверы под все основные ОС, в том числе и под Windows семейств NT и 9л\ Разновидностей таких драйверов две — это VCP- и 02ХХ-драйверы.

VCP на самом деле означает Virtual Communication Port— этот драйвер просто-напросто транслирует все стандартные функции Win32 API, которые мы использовали ранее, в необходимые команды для USB и через микросхему FT232BM (или аналогичные ей, находящиеся в устройстве) опять преобразует их в битовые последовательности UART. При подключении устройства в системе возникает новый СОМ-порт, и все описанные ранее программы без переделок будут работать через него. Это касается и случая, когда используется фирменный "шнурок" USB/RS-232, и когда вы сами нечто подобное изобрели (см. приложение 4). Мало того, в Windows ХР подобный драйвер уже есть, и там ничего вообще устанавливать не надо — единственная разница в том, что виртуальный СОМ, в отличие от реального, не будет виден в системе, пока вы свое устройство не подключите к USB.

Единственный серьезный аопрос, который может возникнуть в случае использования VCP-драйверов, касается скорости передачи — если уж USB, то хочется использовать хоть малую долю возможностей этой шипы, между тем стандартно СОМ-порт через структуру dcb может устанавливать скорость в 256 ООО бод. Есть и приемы установки для СОМ-порта нестандартной скорости обмена, но вопрос о том, насколько это корректно для данного случая, лично для меня, ввиду новизны ситуации, пока открыт (официальная документация не слишком уверенно утверждает, что можно использовать только стандартные скорости). Второй— менее серьезный— недостаток VCP заключается в том, что вы не можете через него работать с встроенной в FT- устройство EEPROM, в которой записан идентификатор устройства и прочие необходимые для USB "прибамбасы".

В этих случаях следует использовать 1)2ХХ-драйвер. работа с которым не сложнее, чем с разобранным ранее компонентом TAf ComPort, но программы, конечно, придется переписывать. С установкой D2XX-,apaiinepa связана одна совершенно глупая трудность (так и хочется написать — "характерная для продуктов MS")— как указывалось ранее, в Windows ХР VCP-драйиер уже есть, и для установки 02ХХ-драйвера нужно устраиват ь некоторые "пляски с бубном", цитирую из русского переложения фирменных рекомендаций по этому поводу (http://www.efo.ru/doe/Ftdi/Ftdi.pI71046):

"Немного сложнее обстоит дело в случае использования операционной системы Windows ХР, которая уже имеет в своем составе сертифицированные VCP-драйверы FTD1. При попытках присоединить к компьютеру новое USB- устройство со стандартными идентификаторами FTDI (например, любой D LP-модуль) система по умолчанию, не спрашивая пользователя, самостоятельно установит VCP-драйверы. Пользователю, желающему работать с D2XX-dpaueepauu, необходимо в этот момент вспомнить, что очень полезно воспитывать в себе терпение и воспользоваться утилитой ftxprcvr.exe, входящей в состав дистрибутива D2XX-dpaueepoe для Windows ХР. Утилита ftxprcvr.exe, используя установившиеся по умолчанию VCP-драйверы, перепрограммирует внешнюю EEPROM. используемую в присоединенном устройстве, и задаст новые значения идентификаторов (VID=0403 и РЮ-6006). После этого необходимо повторить процедуру установки D2.XX-dpaimepoe сначала, т. е. отключить и снова присоединить устройство. Теперь система даст возможность пользователю указать директорию для установки D2XX- драйверов."

Перепрограммировать EEPROM в устройстве USB на основе микросхем FT232BM через свою программу не обязательно, для этого есть фирменная утилита EditEEPROM (http://www.efo.ru/doc/Ftdi/Ftdi.pl7798). Приводить примеры программ для работы с Э2ХХ-драйвером я не вижу никакого смысла — работающего устройства под рукой и у меня, и у вас нет, а просто переписывать фирменную документацию — только бумагу переводить, она уже не однажды переписана и переведена на русский, см., например, цитированную ранее статью или книгу [29]. На сайте екатеринбургской фирмы "Институт радиотехники" есть, в том числе, работающий пример проекта на Delphi (http://www.institute-rt.ru/ftdi/d2xxappl.zip) — а вот сами драйверы с данного сайта скачивать не следует, на момент написания этих строк там лежит устаревший вариант, лучше обратиться к первоисточнику (http:// www.ftdichip.com) или на упоминавшийся сайт компании "Эфо" (http:// www.efo.ru/doc/Ftdi/Ftdi.pl7784).

О некоторых особенностях обработки поступающих через последовательный порт данных мы поговорим в следующей главе.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии

Комментариев 16

  1. alex says:

    Всё бы хорошо сделать с помощью ftdiChip, есть только 2 трудности.
    1. Драйвера не определяются без микросхемы
    2. Задача – после установки драйверов хочется получить в диспетчере устройств в разделах COM и USB соответствующие новые устройства, и возможность их настройки, например перенаправление данных с одного конкретного порта USB на виртуальный COM c настройкой режима передачи данных.

    • Vadik says:

      Делал программатор AVR на ftdiChip. После установки драйвера и подключения в диспетчере видно устройство USB (ftdiChip) и новый компорт на котором можно настраивать скорость.

  2. alex says:

    У меня есть программа AdvancedVirtualComPort (http://www.kernelpro.com/files/AdvancedVirtualComPort.zip). Она создаёт виртуальное устройство, но не даёт возможности его подключения через USB

    • Vadik says:

      Как я уже говорил раньше, в свое время я делал программатор на AVR с использованием FT232RL. Не поленился, достал устройство и подключил его к компьютеру. В диспетчере устройств появился новый порт (у меня Windows 7 x64):

      clip_image002

      На вкладке параметры порта нажал кнопку «Дополнительно»:

      clip_image004

      Вот тут можно поменять его настройки и номер порта в частности.

      Вот ссылка на схему: http://easyelectronics.ru/skorostnoj-avr-usb-programmator-na-ft232rl-bez-vspomogatelnogo-kontrollera.html

      Вот ссылка на страницу загрузки драйверов виртуального Com порта для данной микросхемы:

      http://www.ftdichip.com/Drivers/VCP.htm

  3. alex says:

    красиво..
    У меня Windows 2000 Professional SP 4, а задача состоит в том, чтобы безо всяких микросхем создать многоцелевое программное устройство – переходник с USВ на COM.
    У ftdi на каждую микросхему написан свой драйвер, у используемых мной устройств (таких как USB-модем) – тоже используется COM-интерфейс, однако мне не удаётся задействовать имеющиеся драйвера, потому что писать я их не умею. В Windows 2000 нет (как например в XP) стандартного драйвера для виртуального COM.

  4. alex says:

    номер порта, кстати, и в моей программе менять можно и назначать какой угодно, скорости тоже меняются, порты программно включаются/отключаются

    • Vadik says:

      Чтобы использовать виртуальный COM порт USB модема нужно найти его специализированный драйвер, после установки которого в системе появится виртуальный COM порт соответствующий данному модему. Однако если в модеме не предусмотрена эмуляция COM порта, ни каким драйвером даже самописным реализовать данную функцию не возможно.
      Интерфейс USB в корне отличается от интерфейса COM порта, поэтому для его эмуляции необходима поддержка на уровне аппаратного обеспечения модема и на уровне драйвера ОС.
      Указанная в Вашем комментарии программа лишь перенаправляет и создает виртуальные COM, заменить драйвер модема она не сможет так как должна работать с “готовыми” портами. А созданные её порты являются виртуальными (не связанными ни чем с аппаратной частью).
      При установке драйвера модема на Windows XP виртуальный COM порт появляется?

  5. alex says:

    > если в модеме не предусмотрена эмуляция COM порта, ни каким драйвером даже самописным реализовать данную функцию не возможно.

    Модем сам по себе так устроен, что он предусматривает подключение по интерфейсу COM.

    >нужно найти его специализированный драйвер, после установки которого в системе появится виртуальный COM порт соответствующий данному модему

    Найти нужно. После установки драйверов модема в диспетчере задач системы появляются устройства: 3G PC UI Interface (COM3) и 3G Application Interface (COM4)

    программа лишь перенаправляет и создает виртуальные COM, заменить драйвер модема она не сможет так как должна работать с “готовыми” портами. А созданные её порты являются виртуальными (не связанными ни чем с аппаратной частью).

    В принципе, программа могла бы их использовать.

    Большинство шнуров, подключаемых к USB, прямые и не имеют в своём составе микросхем, а аппаратная часть подключаемых устройств разная, не привязана к какому-то микроконтроллеру

    >При установке драйвера модема на Windows XP виртуальный COM порт появляется?

    Не испробовал, поэтому не знаю, ну по всей видимости он устанавливаться должен так же, как и в Win2k.

    Виртуальный COM в XP может появляться при подключении неизвестных устройств, чего нет в Win2k

  6. alex says:

    http://files.pepperl-fuchs.com/selector_files/navi/productInfo/doct/tdoct1432__eng.pdf

    никак не могу найти архив с драйверами

  7. Борис says:

    Есть кто живой? Выручите! На сервере в организации к FTDI устройству подключены массомеры, само FTDI устройство подключено по USB к серверу, который в свою очередь считывает данные с массомера. Судя по всему слетели драйвера, я их удалил по инструкции: 1. Отключить все устройства из USB разъемов.
    2. Запустить файл ftdiunin.exe – Смотрите на окно сообщения, деинсталляция должна быть завершена полностью. (окно сообщения с complete!!!)
    3. Восстановить файл ftdiun2k.ini.
    4. Перезагрузить компьютер
    5. После перезагрузки провести повторную инсталляцию
    Перезапускаю сервак, подключаю USB с модулем, а система молчит, то есть вообще не реагирует на подключение. Подскажите куда копать?

    • Vadik says:

      Возможно, проблема была не в драйверах вообще. Если были сильные скачки напряжения или гроза мог сгореть сам чип или перегореть предохранитель шины USB (может стоять в корпусе устройства). Можно попробовать подключить устройство к ноутбуку и поставить туда драйвера. На сайте FTDI есть программы для работы с чипом можно их запустить, проверить видят ли они чип и соответственно сделать вывод о его работоспособности. Это серийное устройство, если да то его модель? Хорошо бы знать какое сообщение об ошибке. В других портах USB на сервере пробовали? Нужно больше информации чтобы советовать более конкретно.

      • Борис says:

        Извини забыл написать модель-FT232R, например флешку находит как неопознанное устройство. Кстати на другом компе все работает отлично, так что на устройство грешить не будем. А дело в том что сервер хотя бы сообщение какое об ошибке выдал, но он вобще не реагирует. В диспетчере устройств старые/скрытые устройства удалил.

        • Vadik says:

          Может сервер пишет ошибки в журнал приложений или системы. Может также писать в файл – лог в папке программы. Возможно у вас проблема в общем с драйвером usb (судя по проблемам с флешкой), попробуйте обновить драйвера на чипсет (там в комплекте, чаще всего, и на шину USB есть).

          Вот инструкция по обновлению драйверов USB:
          Для переустановки драйвера USB -контроллера, необходимо выполнить следующие действия:
          1. Нажмите кнопку “Пуск” и выберите пункт меню “Выполнить”;
          2. В поле “Открыть”, впишите команду devmgmt.msc и нажмите кнопку “ОК”;
          3. В окне “Диспетчер устройств”, найдите и разверните ветку “Контроллеры универсальной последовательной шины USB”;
          4. Поочередно удалите все находящиеся там устройства, для этого:
          – кликните правой кнопкой мыши на устройстве;
          – выберите пункт меню “Удалить”;
          – для подтверждения удаления устройства нажмите кнопку “Да”;
          5. Перезагрузите компьютер;

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

          • Борис says:

            Вот что выдает отчет о проблемах:
            Описание
            Драйвер устройства был успешно установлен, но при его запуске произошла ошибка. Код ошибки: 34.

            Сигнатура проблемы
            Имя проблемного события: PnPDeviceProblemCode
            Архитектура: x86
            Код оборудования: *pnp0500
            GUID класса установки: {4d36e978-e325-11ce-bfc1-08002be10318}
            Код проблемы PnP: 00000022
            Имя драйвера: serial.sys
            Версия драйвера: 6.0.6001.18000
            Дата разработки: 01-19-2008
            Версия ОС: 6.0.6002.2.2.0.274.10
            Код языка: 1049

            Файлы, помогающие описать проблему
            DMI7E6F.tmp.log.xml
            LOG7EED.tmp
            msports.inf

            Просмотр временной копии файлов
            Предупреждение: Если проблема была вызвана вирусом или иной угрозой безопасности, открытие копии файлов может повредить компьютер.
            ___________________________________________________________
            Из диспетчера устройств пробовал удалять контроллеры, они обнаружились заново, я даже не успел удалить . Флешки при этом начал находить, но не долго,потом снова стал выявлять не распознанное оборудование. А FTDI находил, так же кратковременно,как неизвестное устройство на которое поставить драйвера,указав путь, выдает сообщение что драйвер не обнаружен.

          • Борис says:

            Помогла замена блока питания!!!

    • Vadik says:

      Если молчит, попробуйте отключить устройство и запустить программу, если выскочит ошибка то значит с чипом FTDI в первом случае программа связывается успешно не отвечает чип с которым связана микросхема ftdi (например – весовой контролер).