Добрый день!
Накидал в delphi программку для управления пинами FT232RL, но при попытке компиляуии выдает: [Error] Unit1.pas(63): Undeclared identifier: 'FT_SetBitMode'
Все очень просто. Функция FT_SetBitMode описана в модуле D2XX как внутренняя. Она не доступна из внешних модулей. Как вариант можно её описание перенести из раздела implementation в раздел interface. Вариант может быть порочным. Долго разбираться со структурой модуля. Думается, что не зря его не вынесли в раздел интерфейса и для установки бит нужно использовать другой способ. Читать нужно про модуль D2XX.
Вы можете сказать как мне тогда установить бит порта в единицу, наипростейшим способом, просто с delphi я начал работать буквально две нелели назад и многое ещё не ясно...
DIMA040891, я в делфи не разбираюсь, и может вопрос неправильный. А как вы даете понять компилятору, что используете модуль драйвера D2XX? Может нужно что-то типа "#include" в Си? Например сюда добавить
UPD. Почитал вот тут как в делфи нужно сишный код импортить, похоже вам нужно импортить интерфейсный модуль. У вас он называется D2XXUnit, судя по всему. Добавьте его в список "uses".
Давно это было. В одном из работающих! проектов пис`ал так :
implementation
uses CfgUnit,D2XXUnit;
Подробности не помню. На момент создания не шибко шарил в Дельфи, но с помощью фирмового
описания, здравого смысла и такой-то матери получился работающий проект.
Описание работы с чипами от FTD, ес-сно, с ftdichip.com. Взял оттуда пример, скомпилил 1:1 - живет. И дальше начал копать в нужную мне сторону.
blackx писал(а):Может нужно что-то типа "#include" в Си?
В модулях Delphi есть раздел uses. Вот в нем все модули, которые нужно подключить и пишутся. Как сделано всеми, кто отвечал на вопрос Димы.
Весь прикол в том, что uses можно писать как в разделе связей (interface), так и в разделе реализации(implementation). Для модуля без разницы. Разница будет в том, что все модули, переменные, классы, процедуры и т.п. будут доступны из других модулей, если они описаны в разделе interface. А все прописанные в разделе implementation - только внутри модуля, в котором описаны. Что и получилось с модулем D2XX. Кстати, сам всегда прописываю все модули именно в разделе interface. А если компилятор сам вставит их в раздел implementation, переношу выше. Поэтому и предложил перенести эту функцию в раздел выше и не морочиться. Скорее всего все будет нормально.
blackx писал(а): В файле ftd2xx.h же она объявлена?
Расширение подключаемых модулей либо .pas, либо .dcu. Файлы с расширением .h подключаются, если используется имеющийся в Delphi встроенный компилятор Си (Builder). Ни разу, за 16 лет программирования на Delphi, использовать его не понадобилось.
polyname писал(а):нужно было объявлять внешние С-функции как stdcall и external
Можно. И не обязательно написанных на Си. Но скомпилированных отдельно. Но геморойно это. Начинаются проблемы со стеком. Порядок передачи данных у Си и паскаля разный. Постоянно помнить об этом и не забывать чистить стек.
Нет, не так.
Во-первых, модуль уже так и прописан, во-вторых проблема в вызове функции из этого модуля.
Нужно в самом модуле D2XX, описание этой функции в разделе реализации
implementation
...
function FT_SetBitMode(........);
перенести в раздел
interface
function FT_SetBitMode(........);
Именно перенести, а не скопировать. После этого, для полной уверенности, переименовать файл D2XXUnit.dcu во что-нибудь, типа D2XXUnit.dc_, или во что угодно. После компиляции файл dcu будет создан снова, но уже измененный.
Вообще не понимаю о чём спор. Если о том, что функция не вынесена в интерфейсы, то юзайте Set_USB_Device_BitMode
она вынесена в интерфейс и из неё вызывается FT_SetBitMode(FT_Handle,Mask,Enable);
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!