C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Работа с портом USB с микросхемами FTDI
Admin
Отправлено: 10.07.2006, 13:05


Владимир

Группа: Администратор
Сообщений: 1190



Множество устройств разрабатывается с помощью микросхем FTDI.

Для работы с USB-портом в C++Builder для них есть соответствующие библиотеки:
http://ftdichip.com/Drivers/D2XX.htm
это необходимые файлы: Ftd2xx.dll Ftd2xx.lib Ftd2xx.h

Но C++Builder ругается на несовместимость с библиотекой FTD2XX.lib.

Делаем её совместимой:

1/ Из папки bin где установлен C++Builder (у меня это C:\Program Files\Borland\CBuilder6\Bin) копируем в папку с этими библиотеками
файлы implib.exe и impdef.exe

2/ Из командной строки запускаем>impdef.exe Ftd2xx Ftd2xx
создав этим файл Ftd2xx.def

3/ Из командной строки запускаем>implib.exe -f Ftd2xx.lib Ftd2xx.dll
создав файл Ftd2xx.lib совместимый с C++Builder


Проверяем совместимость:

Создаем в С++Builder новый проект, подключаем к нему
Ftd2xx.lib указав этот файл в меню Project->Add to project

Пишем код:
CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "FTD2XX.H"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

FT_STATUS ftStatus;
DWORD numDevs=0;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ftStatus = FT_ListDevices(&numDevs, NULL, FT_LIST_NUMBER_ONLY);
if(ftStatus == FT_OK){
ShowMessage("FT_ListDevices Ok !");
ShowMessage(numDevs);
}else{
ShowMessage("FT_ListDevices Failed !");
}
}
//---------------------------------------------------------------------------


Запускаем компиляцию.
Если все откомпилилось и запустилось — библиотека подключена успешно.

Также можно почитать:
http://www.filur.net/PDF/FTDI/stat/D2xx.htm
http://www.efo.ru/cgi-bin/go?0009091046

Отредактировано Admin — 10/07/2006, 13:11
klen
Отправлено: 12.07.2006, 22:03


Машинист паровоза

Группа: Участник
Сообщений: 239



Вставлю свой пятак, благо с рождения FTDI мучаемся с микрухами и много шишек набили smile.gif
Коротко.
1. Идущий с драйверами .lib не точтобы не совместим с CBuilder (как раз с ним то совместим) а несоместим с .dll. Причина банальна — драйверы пишут по заказу FTDI сторонние изобретатели, причем периодически разны. либы как показала практика обычно не соответствуют содержимому dll. Детальный анализ показывает что часть функций в родной lib оформлены не ввидк ссылок на dll а ввиде скомпилированного кода и предствляют повторную реализацию того что в dll. Причем они отличаются и это приводит к глюкам.
2. Приведенный выше метод решает только часть проблем. Например собранная пророграмма с либой генеренной от одной версии dll может начать глючит на другой машине с другой версией dll. Причина — различные наборы экспортируемых функций в различных версиях dll.
3. Я избавился от постоянных глюков только ОДНИМ способом — непосредственно читать адреса функций из dll не используя никаких либов. Тоесть использую класс врапер который в конструкторе дергает все функции из загруженной dll.
3. На лицо бардак, но FT2233 уже почти без внутренней жизни.

Тема актуальна, давайте обсуждать.


Отредактировано klen — 12/07/2006, 22:08
Schumi
Отправлено: 18.07.2006, 08:56


Машинист паровоза

Группа: Участник
Сообщений: 206



я всегда со своим приложением ложу длл. Тогда проблем со статической линковкой не будет.
Хотя я загружаю динамически длл...

И еще — по части vcp. По умолчанию ставится скорость 4 кб/c. Как выставить при установки драйвера скорость 115200. В реестре не нашел где хранится. Всякие там MinReadTimeout, LatencyTimer есть, а вот нужного нет.

Отредактировано Schumi — 18/07/2006, 09:11
klen
Отправлено: 31.07.2006, 12:30


Машинист паровоза

Группа: Участник
Сообщений: 239



QUOTE (Schumi @ 18/07/2006, 08:56)
И еще — по части vcp. По умолчанию ставится скорость 4 кб/c. Как выставить при установки драйвера скорость 115200. В реестре не нашел где хранится. Всякие там MinReadTimeout, LatencyTimer есть, а вот нужного нет.

Непонятно что такое по умолчанию??
Вы когда устройство открываете, Вы же его по любому конфигурите, втом числе и скорость. Какая разница что там по умолчанию драйверы ставят — пишите всегда явно то что нужно и все.
Schumi
Отправлено: 03.08.2006, 13:38


Машинист паровоза

Группа: Участник
Сообщений: 206



Ээээ. Да чего — то загнул. Какой-то глюк был.

А еще байда — виртуальный порт через FTDI вместе с пзу. Там забит серийный номер. Возникает вопрос, как сопоставить порт и серийник.
Программа должна открывать только свой порт.
Понятно, что когда подключен только один порт — просто: получаем список пдключенных устройств, если одно — читаем серийник и все оки.
А когда несколько — список номеров вирт. портов определить могу, ладно.
Соответственно порядковый номер устройства FTDI с заданным серийником напрямую через драйвер тоже узнать могу.
А как их сопоставить?
Точнее, всегда ли будет соответствовать — меньший номер виртуального порта и порядковый номер устройства в списке USB.
В XP то всегда она создает порт, а вот в 98 нет — есть у меня также устройства ftdi, но с другим vid/pid, для которых просто устанавливается usb-устройства без вирт. порта

Вернуться в Работа с внешними устройствами