|
Программирование USB, Borland C++ Builder 6 |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 35)
|
Feb 12 2010, 18:44
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Если USB-устройство запрограммировано, как виртуальный COM-порт (CDC-устройство), то со стороны Windows оно видно, как дополнительный COM-порт, работа с которым почти ничем не отличается от работы с обычным. "Почти" означает, что он, в отличие от настоящего, игнорирует установку бодов, четности, стоп-битов, уровней линий и пр., а всегда работает с максимальной скоростью.
Соотвественно этому, на любом языке программирования крайне просто с ним работать. Открываешь файл с именем "\\.\COM8" (номер порта может быть любой) и кидаешь в него байты или читаешь их оттуда. Всё как при работе с файлом. Предельно просто и удобно.
А вот со стороны устройства приходится потрудиться, чтобы чтобы все это работало. Особенно, если у вас МК со встроенным USB, а вы в USB ничего не понимаете.
С HID-устройствами люди тоже работают, но я их не люблю и не использую. Мне по душе CDC-устройство, которое эмулирует COM-порт. При этом зачастую переход на USB-интерфейс позволяет использовать старые программы, расчитанные на связь по COM-порту. И если в своем устройстве поддерживаешь старый протокол, то программа никогда не узнает, что работает через USB.
|
|
|
|
|
Feb 12 2010, 19:13
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 7-05-05
Из: China, Shenzhen
Пользователь №: 4 812

|
Цитата(smk @ Feb 13 2010, 00:09)  Время традиционных СОМ-портов ушло. Теперь доминирует USB, по этому если требуется обеспечить работу прибора совместно с РС - следует применять именно USB. Собственно вопрос о том как используя Borland C++ Builder 6 создать необходимое ПО для РС, а именно в той части как обеспечить диалог по USB? Гуглил много, но самая популярная книга рассматривает это по в разрезе Visual C. Спасибо. самое простое это реализовать HID или CDC (т.е. виртуальный ком порт), большинство производителей микроконтроллеров обычно дают примеры реализации таких устройств. а также они обычно не требуют написания своих драйверов (в винде уже есть дрова), иногда просто обходятся немного подправленным inf файлом. Но у этих девайсов есть один недостаток, это скорость... Если нужна высокая скорость, то придется копать в сторону BULK устройств... и к ним придется писать свой драйвер (но можно и схитрить да взять готовый, к примеру из пакета usbio http://www.thesycon.com/eng/usbio.shtml (но тут он демо, по-моему на 240 минут работы) и в нем есть также примеры для PC, и еще тут он используется www.tnkernel.com или еще лучше из PowerPac (там же есть и пример для контроллера и тестовые утилиты для PC под Visual Studio причем на чистом СИ, так что понять легко)) Ну или написать свой BULK драйвер, пример такого драйвера есть в DDK (а ныне WDK). еще можно копнуть в сторону "nrComm Lib Pro" компонентов, правда не знаю поддерживают ли они 6-ой Builder, так вот в них есть компонента для работы с USB. и еще можно тут посмотреть кое-какие идеи https://forums.codegear.com/thread.jspa?thr...2&tstart=30PS: вот только IAR похоже сильно торопились с релизом PowerPac, и немного накосячили, (пример для контроллера STM32 для usb так и не завелся, хотя в предыдущей версии PowerPac работал сразу) а еще они забыли вложить исходники файлов для работы с USB (в прежней версии они есть), да и без них примеры для PC не скомпилятся. В общем вот эти файлы, во вложении...
Сообщение отредактировал UniSoft - Feb 12 2010, 19:26
|
|
|
|
|
Feb 12 2010, 20:12
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Может быть кто-то знает, в каких случаях CDC-устройство получает команды: Код #define SEND_ENCAPSULATED_COMMAND 0x00 #define GET_ENCAPSULATED_COMMAND 0x01 Вот уже год ищу везде, но так ничего и не нашла. Что надо в устройство послать, чтобы она получила эти экзотические команды? А с остальными CDC-командами все предельно ясно без описаний: Код #define GET_LINE_CODING 0x21 #define SET_LINE_CODING 0x20 #define SET_CONTROL_LINE_STATE 0x22 #define SEND_BREAK 0x23 - тут я сразу догадалась.
|
|
|
|
|
Feb 13 2010, 00:20
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(Xenia @ Feb 12 2010, 23:12)  Может быть кто-то знает, в каких случаях CDC-устройство получает команды: Код #define SEND_ENCAPSULATED_COMMAND 0x00 #define GET_ENCAPSULATED_COMMAND 0x01 Вот уже год ищу везде, но так ничего и не нашла. Что надо в устройство послать, чтобы она получила эти экзотические команды? Возможно это поможет...
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Feb 13 2010, 11:46
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(smk @ Feb 13 2010, 11:18)  Идея понравилсь, однако не ясно как использовать два устройсва одновременно поскольку инсталяция следующего требует деинсталяции предидущего: (1) Clean up the previously installed AVR-CDC drivers, if any. See the [Uninstallation] section. Не путайте инсталляцию драйверов и втыкание устройства. Воткнете два - будут работать два. Цитата(smk @ Feb 13 2010, 11:18)  FTDI это CDC как я понимаю? Нет.
|
|
|
|
|
Feb 13 2010, 19:54
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 7-05-05
Из: China, Shenzhen
Пользователь №: 4 812

|
Цитата(smk @ Feb 13 2010, 14:50)  Спасибо! Да, поддерживает, да есть USB. Но твм другая беда: trial version with nag screen. Как я понимаю на долгую и плодотворную работу расчитывать не приходится? есть, такое... но можно на-гуглить вот такие ссылки... http://www.dumpz.ru/showpost.php?p=533673&postcount=390http://rapidshare.com/files/294620815/nrCo..._7-2010_-_FS.7zhttp://www.onlinedisk.ru/file/244810/Цитата(smk @ Feb 13 2010, 16:18)  Хотелось бы прояснить вопросы программирования при использовании FTDI микросхем. Там драйвер не есть проблема и серийные номера там я думаю тоже все разные. А как писать ПО со стороны ПК? Как произвести обмен пакетами? FTDI это CDC как я понимаю? Нет, FTDI это не CDC класс... А работать с FTDI вообще просто, одно удовольствие... они могут работать в двух режимах, либо как виртуальный ком порт, либо как D2XX устройство. Конфигурация (VID, PID, и режимы) программируются в eeprom, обычно весит снаружи, но есть и с внутренней eeprom'кой (обозначены как R, например FT232R, и в них, кстати, есть уникальный серийный номер, можно использовать для защиты от копирования)... В режиме ком порта, работать можно как с обычным ком портом... А в режиме D2XX, ftdichip предоставляют свой набор api функций в DLL, работа через которые намного упрощается... У них на сайте http://www.ftdichip.com есть и вся необходимая документация, а также множество примеров, под разные компиляторы.
|
|
|
|
|
Mar 2 2010, 08:37
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 27-11-08
Пользователь №: 41 999

|
Цитата(KSN @ Feb 27 2010, 08:28)  Для работы с USB в C++Builder 6 можно использовать бесплатную библиотеку libusb-win32 ( http://libusb-win32.sourceforge.net) Пользуюсь ей регулярно. Абсолютно согласен! Всего-то делов - загрузить в память библиотеку libusb, и дальше просто тупо вызывать оттуда функции. Будет работать не только в Borland C+, но и в Visual Studio C++, Visual Basic, Delphi, GCC и т. д. Примеры готового кода (не только программ для компьютера, но и для firmware USB-устройств) можно найти в библиотеке V-USB. Русифицированную библиотеку V-USB можно скачать тут.
|
|
|
|
|
Nov 10 2010, 09:31
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Цитата(KSN @ Feb 27 2010, 09:28)  Для работы с USB в C++Builder 6 можно использовать бесплатную библиотеку libusb-win32 ( http://libusb-win32.sourceforge.net) Пользуюсь ей регулярно. А Вы как-то ее инсталлировали в C++ Builder?
|
|
|
|
|
Nov 11 2010, 06:42
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(smk @ Nov 10 2010, 20:51)  По правде сказать почти ничего не понятно. Какая пометка? Как упаковать? Борланд позволяет подключать паскалевские исходники с директивой pascal (читайте руководство или популярную литературу) Также у него есть свой формат библиотек, в которые можно упаковать часть программы. В закромах есть Архангельский, но очень тяжёлый, сразу предупреждаю. У меня где-то был полегче, но видать погиб на обломках сдохшего винта Я подобное делал в дельфях, правда, давно уже. Вроде ничего сверхЪестественного, несколько интуитивных движений, и при помощи какой-то матери родилась подключаемая либа
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Nov 11 2010, 07:45
|
Группа: Участник
Сообщений: 8
Регистрация: 8-02-05
Пользователь №: 2 495

|
Цитата(MrYuran @ Nov 11 2010, 10:42)  Я подобное делал в дельфях, правда, давно уже. Вроде ничего сверхЪестественного, несколько интуитивных движений, и при помощи какой-то матери родилась подключаемая либа А поподробней можно, как и с помощью, какой матери подключить к DELPHI исходники libusb.
|
|
|
|
|
Nov 11 2010, 12:53
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(редактор @ Nov 11 2010, 15:46)  Для борланда есть утилита implib.exe в бинах кажется лежит. С ее помощью можно "скомпилить" из dll-библиотеки LIB-файл. Далее этот lib подключить к проекту а в директорию с EXE поместить DLL файл. Да там не dll, а исходники на паскале. В принципе, ничего сложного нет, тем более что файл проекта .bpk тоже присутствует, со всеми настройками. Есть также папки с готовыми примерами. Просто у меня сейчас ничего под рукой нет, и ставить нет никакого желания. А по памяти советовать тяжело.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Nov 13 2010, 15:11
|
Группа: Участник
Сообщений: 8
Регистрация: 8-02-05
Пользователь №: 2 495

|
Цитата(MrYuran @ Nov 11 2010, 16:53)  Да там не dll, а исходники на паскале. В принципе, ничего сложного нет, тем более что файл проекта .bpk тоже присутствует, со всеми настройками А носом ткнуть не тяжело, а то не вижу, где лежит
|
|
|
|
|
Nov 15 2010, 18:43
|
Группа: Участник
Сообщений: 8
Регистрация: 8-02-05
Пользователь №: 2 495

|
Цитата(smk @ Nov 14 2010, 14:27)  HIDKomponente.zip в посте №19 скачать. Спасибо!
|
|
|
|
|
Nov 17 2010, 03:39
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Цитата(smk @ Nov 17 2010, 03:13)  Так удалось кому-то прикрутить эту библиотечку к Bulderu? Библиотека устанавливается в билдер точно также (полностью аналогично) как и в делфи. Компонент написан так, чтобы поддерживать установку и туда и сюда, а билдер легко устанавливает такие компоненты. Единственно, что свежий компонент надо смотреть в составе библиотеки jedi (но это на вкус).
|
|
|
|
|
Nov 21 2010, 10:43
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Компонент поставил. Все компилится, примеры тоже. Только вот с использованием пока не выходит. Смотрел примеры. Что-то понятно, а что-то нет. Можно простой пример как вывести перечень подключенных устройств? Ну или подсказку какую. Код //******************************************************************************** ******** // процедура обновляет данные о всех HID устройствах, подключенных к шине USB void __fastcall TForm1::JvHidDeviceController1DeviceChange(TObject *Sender) { if (DevList == NULL){ // создать список устройств DevList = new TList(); } else{ // освободить список устройств от всех записей указателей на устройства for (int i = 0; i < DevList->Count; i++) ((TJvHidDevice *)DevList->Items[i])->Free(); // очистка списка устройств DevList->Clear(); }
// очистка компонента ListBox от старых записей названий или идентификаторов устройств ListBox1->Clear();
Form1->Caption = ""; // перечисление всех HID устройств, подключенных к шине USB JvHidDeviceController1->Enumerate();
Label1->Font->Color = clPurple; Label1->Caption = "USB устройство обмена данными не подключено"; Label2->Visible = false; } //******************************************************************************** ******** // процедура получает данные о всех HID устройствах, подключенных к шине USB bool __fastcall TForm1::JvHidDeviceController1Enumerate( TJvHidDevice *HidDev, const int Idx) { AnsiString S;
// добавление названия или идентификаторов устройства в компонент ListBox if (HidDev->ProductName != NULL) ListBox1->Items->Add("Подключено устройство: " + HidDev->ProductName); else ListBox1->Items->Add(S.sprintf("Device VID=%04X PID=%04X", HidDev->Attributes.VendorID, HidDev->Attributes.ProductID));
// получение указателя на устройство JvHidDeviceController1->CheckOutByIndex(Dev, Idx);
// добавление указателя на устройство в список устройств DevList->Add(Dev);
// инкремент индекса записи ListBox1->ItemIndex ++;
// получение указателя на устройство из списка устройств TJvHidDevice *Dev = (TJvHidDevice *)DevList->Items[ListBox1->ItemIndex];
S = "USB устройство обмена данными"; if (HidDev->ProductName == S){ CurrentDevice = Dev; // активное HID устройство // число байтов для записи в HID устройство ToWrite = CurrentDevice->Caps.OutputReportByteLength; Form1->Caption = HidDev->ProductName; // название устройства if(CurrentDevice != NULL) CurrentDevice->OnData = NULL; if(CurrentDevice->HasReadWriteAccess) CurrentDevice->OnData = ShowRead; else CurrentDevice->OnData = NULL; } return(true); } //******************************************************************************** ******** void __fastcall TForm1::JvHidDeviceController1DeviceDataError( TJvHidDevice *HidDev, DWORD Error) { MessageDlg("ОШИБКА чтения из HID. GetLastError=" + IntToStr(GetLastError), mtError, TMsgDlgButtons() << mbOK, 0); } //******************************************************************************** ******** Вот такое есть в примере. Как вызываются эти процедуры? Взято оттуда:
USB_HID_Wind.rar ( 232.89 килобайт )
Кол-во скачиваний: 495Спасибо.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|