![]() |
|
#1
|
|||
|
|||
![]() Здравствуйте всем.
Случилось у меня,что приобрел я однажды некий крутой девайс АЦП-ЦАП.Теперь не могу к нему программно доступиться,хотя документация есть.Проблемма в том,что примеры даны на языке С,в котором я ... ну ничего не... Здесь я подаю материалы,как они поданы в примере документации.Может кто-нить поможет мне перевести эти команды в делфовский вид и запустить таки этот мудреный девайс? В исходнике прилагается некая DLL библиотека IsaBox.dll ------------------------------------------------------------- Пример сборки шины и доступа к портам В данном примере подключим устройство на COM2. Скорость обмена по COM-порту 115200 кбит/с, адрес контроллера 0x05. Код:
#define COM2 1 #define LOCAL_PORT 5100 void main(void) { unsigned long ComInterface, ComController; unsigned short PortValue; // 1. Очистка реестров интерфейсов и контроллеров ibcClearControllerList();// это функции библиотеки IsaBox.dll ibcClearInterfaceList(); // 2. Регистрация интерфейса ComInterface = ibcOpenInterface(COM2, 115200, NULL);// это функции библиотеки IsaBox.dll // 3. Регистрация контроллеров ComController = ibcOpenController(ComInterface,0x05,0x300,0x309); // 0x300,0x309 - адреса портов ввода-вывода сего девайса } Вот что попробовал сделать я.Ввиду моего малого опыта программирования,я решил библиотеку IsaBox.dll подключить статически. ------------------------------------------------------------------ Код:
... var OpenInterf:cardinal; implementation {$R *.dfm} {N+,E+} // так содрал с руководства Фараонова Procedure ibcClearControllerList; Far; External 'Isabox.dll'; Procedure ibcClearInterfaceList; Far; External 'Isabox.dll'; Function ibcOpenInterface(Com:byte;baud:longint;p:pointer):cardinal; Far; External 'Isabox.dll'; Function ibcOpenController(handle:longint;adr:longint;adr0:longint;adr1:longint):cardinal; Far; External 'Isabox.dll'; procedure TForm1.Button1Click(Sender: TObject); begin ibcClearControllerList(); ibcClearInterfaceList(); OpenInterf:=ibcOpenInterface(COM2,115200,nil);// на этом загвоздка.Выдает error end; lmikle: пользуем теги!!! Вот и все.При пошаговой отладке две первые команды проходят,а третья выдает ошибку.В чем дело не знаю.Может я типы неправильно назвал или записал не так? Может кто из опытных ребят поможет привести модуль в рабочий вид? Заранее всем спасибо. userlife |
#2
|
|||
|
|||
![]() 1. Не факт, что ты правильно импортировал функции библиотеки. Для первых функций, кторые без параметров, модель вызова не важна. А вот для третьей - очень даже важна. Попробуй пометить импортируемые функции как stdcall;
2. Не уверен, что типы параметров у тебя указаны правильно. Надо смотреть точное поисание заголовка фуниций в документации и уже тогда выбирать типы соотв. параметров. Например, там, где указано unsigned short лучше использовать WORD; По имени библиотеки можно найьт описание функций. Например: Код:
unsigned long ibcOpenInterface(unsigned char ComPort, unsigned long Baudrate, HANDLE OpenPortHandle); я бы оттранслировал бы так: Код:
function ibcOpenInterface(ComPort : Byte; Baudrate : DWORD; OpenPortHandle : THandle) : DWORD; stdcall; external 'IsaBox.dll'; |
#3
|
|||
|
|||
![]() Спасибо,товарищ Модератор.
Сделал так как Вы рекомендовал и отладчик плеваться эррорами перестал.Пришлось методом программного втыка добавить выключение-включение девайса (о чем в руководстве почему-то не сказано),потом он перестал виснуть на запросах портов.Пишет ли он в них что-то (например управляющие слова) пока неизвестно,но вычитать оттуда моей программой еще ничего не удалось.Не читаются пока порты.Сидел полдня,тыкал-тыкал,типы данных менял и увы - ничего. Кстати,за подобный вопрос в Королевстве Делфи на меня надулись и посмотрели очень злобно.Я наверное задаю дурные вопросы? Не проффесионал ведь.Хобби только.А вам спасибо за человечность.Все ж когда-то были начинающими.Не так ли? |
#4
|
|||
|
|||
![]() Ну, вообще, на будущее запомни, что сишные библиотеки обчно надо импортировать, указывая соглашение о передачи параметров именно как stdcall. А нет ли для этой штуки COM-интерфейса. С ним бы было тебе гораздо проще, т.к. импорт производится автоматически, да и работать чуть удобнее, хотя, в общем, работает и чуть медленнее.
|
#5
|
|||
|
|||
![]() Вся эта штуковина в черном длинном корпусе разработана под шину ISA.
Но поскольку у меня ноутбук и ничего в него уже не сунешь,ребята в этом самом ящике сделали прототип этой самой шины и подцепили его к USB.Так что прежде всего я установил USB драйвер,потом зарегистрировал в Виндовсе IsaBox.dll. В устройствах после инсталляции появляется новый COM порт,который можно выбрать из свободных с номерами от COM1 аж по COM16. Далее там прилагается готовая программа IsaBox Administrator.Так через нее этот девайс виден и даже работает,но для моих целей требуется собственное программирование.То,что есть в прилагаемой документации,пока реализовать не удалось.Сейчас снова буду рыться в науке.Поробую заводить в порты и выводить из них вручную этим самим Администратором. Результаты сообщу как только что-нибудь получится. |
#6
|
|||
|
|||
![]() COM, который я имел в виду - это Component Object Model, а не COM-порт
![]() |
#7
|
||||
|
||||
![]() userlife
Немного непойму - Вы тему закончили или нет? Те несколько функций, которые Вы привели, Вам подсказали как переводить на Delphi. Правда на следующих страницах "ТЕХНИЧЕСКОГО ОПИСАНИЯ" ( которое занимает 19 страниц - из них 10 описание API Isabox.dll ) есть еще функции управления через эту dll. Правда я не понял - у Вас ЦАП, АЦП или "ISA-BOX - выносные модификации плат ввода-вывода" ? Если есть на диске файл *.h то когда то находил программки преобразования h2pas. ( они хоть не идеальны но основное переводят ). Вы только не обижайтесь, но для помощи нужна информация, а не черная коробочка и несколько функций ( если помощь нужна ). Цитата:
|
#8
|
|||
|
|||
![]() Спасибо за замечания.А чего обижаться-то? Вы человек сведущий,я - начинающий.Естественно есть и будет разница в подходах к решению проблемы.Главное не ссориться,а то на Королевство Делфи я и заходить боюсь.Такое впечатление,что за твою неопытность там готовы на тебя спустить кибер-пса
![]() Намучался я целый вечер,а порты так и остались недоступны. Вот описание функций их руководства,которые я задействовал: ------------------------------------------------------------------------------------------------------------ Из прикладной программы перед началом сборки шины нужно вызвать функции ibcClearInterfaceList и ibcClearControllerList для очистки реестра интерфейсов и контроллеров. Для регистрации интерфейсов вызываются функция ibcOpenInterface. Функция вызывается при регистрации COM-порта. Контроллеры с USB интерфейсом создают при подключении виртуальный СОМ-порт, поэтому эта функция вызывается по тем же правилам.Функция при успешном выполнении возвращает ИДЕНТИФИКАТОР ИНТЕРФЕЙСА. Этот идентификатор используется при регистрации контроллеров. Для регистрации контроллеров вызывается функция ibcOpenController. При регистрации контроллера нужно указать ИДЕНТИФИКАТОР ИНТЕРФЕЙСА, к которому подключен контроллер, АДРЕС КОНТРОЛЛЕРА и ДИАПАЗОН АДРЕСОВ ШИНЫ ISA, которые он будет обслуживать. После этих манипуляций вызывается функция ibcControl, которая производит подключение к COM-портам.Теперь шина ISA собрана и готова к использованию. |
#9
|
|||
|
|||
![]() 2.1. Очистка реестра интерфейсов и контроллеров
void ibcClearControllerList(void); void ibcClearInterfaceList(void); Параметры: отсутствуют; 2.2.Регистрация COM-порта unsigned long ibcOpenInterface(unsigned char ComPort, unsigned long Baudrate, HANDLE OpenPortHandle); Параметры: 1. ComPort – номер COM-порта; (0 - COM1, 1 - COM2 и т.д.); 2. Baudrate – скорость обмена; (1200 – 115200); 3. OpenPortHandle – если есть необходимость подключить к одному порту различные устройства (на RS-485), то этот порт нужно открыть до его регистрации в библиотеке и хендл открытого порта передать третьим параметром. Если такой надобности нет, то прировнять его к NULL. Возвращаемый параметр: идентификатор интерфейса. Используется при регистрации контроллеров. (См. ниже) 2.3.Регистрация контроллера unsigned long ibcOpenController(unsigned long InterfaceHandle, unsigned long Address, unsigned short StartAddress, unsigned short StopAddress); Параметры: 1. InterfaceHandle – идентификатор интерфейса возвращаемый функциями регистрации интерфейсов; 2. Address – адрес контроллера; ( 1 – 255 для RS, 0 – широковещательный) 3. StartAddress, StopAddress – диапазон адресов шины ISA которые будет обслуживать контроллер. Возвращаемый параметр: идентификатор контроллера. Используется при вызове сервисных функций для получения дополнительной информации о контроллере. (См. ниже) 2.4.Включение/выключение шины bool ibcControl(bool status); Параметры: 1. status – (true/false); Возвращаемый параметр: в случае успешного подключения к зарегистрированным COM-портам и создания сокетов функция возвращает true. В противном случае – false. 2.5.Побайтный и пословный доступ к одному порту bool ibcReadPort(unsigned short address, unsigned char *value); bool ibcWritePort(unsigned short address, unsigned char value); bool ibcReadPortW(unsigned short address, unsigned short *value); bool ibcWritePortW(unsigned short address, unsigned short value); Параметры: 1. address – адрес порта шины ISA; 2. value – значение, записываемое в порт или считываемое с порта. Возвращаемый параметр: в случае успешного выполнения функция возвращает true. В противном случае – false. Причиной не успешного вызова может стать либо не правильно зарегистрированный интерфейс и/или контроллер либо плохая линия связи с контроллером. ================================================ Это документация.А вот что сделал я на Делфи ================================================ |
#10
|
|||
|
|||
![]() 2.6. Библиотеку IsaBox.dll со всем этим добром я поместил в папке проекта
Код:
var Form1: TForm1; OpenInterf,OpenContr:DWORD;//будут использоваться для открытия и регистрации Vkluc:boolean=false;// я проверю как сработала функция S:string;// то для моих сообщений r:word;// для чтения из порта N:byte;// для цикла запросов на вызов функции доступа к порту (ам) implementation {$R *.dfm} //это поставило само.не знаю зачем Procedure ibcClearControllerList; stdcall; External 'Isabox.dll'; Procedure ibcClearInterfaceList; stdcall; External 'Isabox.dll'; Последний раз редактировалось Admin, 19.12.2009 в 11:21. |
#11
|
|||
|
|||
![]() Код:
Function ibcOpenInterface(ComPort:Byte;Baudrate:DWORD;OpenPortHandle:THandle): DWORD; stdcall; External 'IsaBox.dll'; Function ibcOpenController(OpInt:DWORD;adr0:DWORD;adr1:WORD;adr2:WORD):DWORD; stdcall; External 'Isabox.dll'; Function ibcControl(a:boolean):boolean; stdcall; External 'Isabox.dll'; Function ibcReadPort(adr:word;value:byte):boolean; stdcall; External 'Isabox.dll'; Function ibcWritePort(adr:WORD;value:byte):boolean; stdcall; External 'Isabox.dll'; Function ibcReadPortW(adr:word;value:word):boolean; stdcall; External 'Isabox.dll'; Function ibcWritePortW(adr:word;value:word):boolean; stdcall; External 'Isabox.dll'; procedure TForm1.Button1Click(Sender: TObject); begin ibcClearControllerList(); ibcClearInterfaceList(); OpenInterf:=ibcOpenInterface(0,115200,0);// девайс я посадил на COM0,а вместо рекомендованого NULL просто поставил ноль. OpenContr:=ibcOpenController(OpenInterf,$1,$300,$30F);// адрес устройства $1 взял из сообщений IsaBox администратора,а адреса $300-300F штатные,к которым привязан контроллер. ibcControl(false);// в руководстве этого трюка нет,но если я его не введу,все зависнет при первом же доступе к портам ibcControl(true);// собираю шину,как советует руководство for N:=0 to 10 do // и пробую,авось на каком-то разу все-таки "пробьет"... begin Vkluc:=ibcWritePort($307,$80);// пробую записать в порт управляющее слово if Vkluc=true then S:='True' else S:='False'; memo1.Lines.Add(S); sleep(500); // на экране в форме выводит False False false ... end; end; end. Кажется запас моих знаний для решения проблемы исчерпан. Что дальше? Кто поможет разобраться? Спасибо заранее. Последний раз редактировалось Admin, 19.12.2009 в 11:25. |
#12
|
||||
|
||||
![]() Пока у меня есть немного свободного времени немного помогу.
Для начала предлагаю вынести функции dll в отдельный модуль. скачайте Isabox_h.zip, распакуйте файл Isabox_h.pas в папку проекта, а в форме удалите описания функций и запишите Код:
implementation uses Isabox_h; Код:
Function ibcReadPort(address: WORD; var value: Byte):ByteBool; stdcall; External 'Isabox.dll'; bool записал как ByteBool на всякий случай. В MSDN про bool написано что в Visual C++ 4.2 занимает 4 байта в Visual C++ 5.0 и выше - 1 байт. Скачал ТО на WAD-DAC16-16( у вас это устройство или другое? ). Попробуйте так Код:
var Form1: TForm1; OpenInterf, OpenContr: DWORD; //будут использоваться для открытия и регистрации Vkluc: ByteBool = false; // я проверю как сработала функция S: string; // то для моих сообщений r: word; // для чтения из порта implementation uses Isabox_h; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin ibcClearControllerList(); ibcClearInterfaceList(); OpenInterf := ibcOpenInterface(0, 115200, 0); // девайс на COM0,а NULL = 0. memo1.Lines.Add('OpenInterf := ' + IntToStr(OpenInterf)); // проверим подключение OpenContr := ibcOpenController(OpenInterf, $1, $300, $30F); // адрес устройства $1 из сообщений IsaBox администратора,а адреса $300-300F штатные,к которым привязан контроллер. memo1.Lines.Add('OpenContr := ' + IntToStr(OpenContr)); // проверим подключение, надеюсь джамперы выставленны именно для адресов $300-300F ibcControl(false); // периодически пробуйте без этого ( может sleep(200); ниже был необходим ibcControl(true); // собираю шину,как советует руководство sleep(200); // в примерах на турбо паскале вроде здесь должно быть for i := 0 to 10 do // и пробую,авось на каком-то разу все-таки "пробьет"... begin Vkluc := ibcWritePort($307, $80); // пробую записать в порт управляющее слово if Vkluc = true then S := 'True' else S := 'False'; memo1.Lines.Add(S); sleep(500); // на экране в форме выводит False False false ... end; end; |
#13
|
||||
|
||||
![]() Полистал ТО.
Откуда Вы взяли $307 ? Или я не то руководство скачал, или читайте первую часть. Там сказано: Цитата:
Т.е. делается примерно так: Код:
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin // очищаем ibcClearControllerList(); ibcClearInterfaceList(); OpenInterf := ibcOpenInterface(0, 115200, 0); // открываем интерфейс memo1.Lines.Add('OpenInterf := ' + IntToStr(OpenInterf)); // проверим подключение OpenContr := ibcOpenController(OpenInterf, $1, $300, $30F); // открчваем контроллер memo1.Lines.Add('OpenContr := ' + IntToStr(OpenContr)); // проверим подключение ibcControl(true); // включаем шину sleep(200); // задержка Vkluc := ibcWritePort($301, $01); // подаем питание и включаем запись sleep(200); // задержка Vkluc := ibcWritePort($303, $10); // выбираем адр. канала и кол-во точек в периоде Vkluc := ibcWritePortW($304, $0000); // запись в ОЗУ Vkluc := ibcWritePortW($304, $1000); // запись в ОЗУ Vkluc := ibcWritePortW($304, $2000); // запись в ОЗУ Vkluc := ibcWritePortW($304, $3000); // запись в ОЗУ Vkluc := ibcWritePortW($304, $4000); // запись в ОЗУ Vkluc := ibcWritePortW($304, $5000); // запись в ОЗУ Vkluc := ibcWritePort($301, $01); // включаем запись Vkluc := ibcWritePort($303, $10); // выбираем адр. канала и кол-во точек в периоде Vkluc := ibcWritePort($301, $03); // включаем чтение // отключаем шину ibcControl(false); // это не обязательно сдесь end; типа Код:
if Vkluc then memo1.Lines.Add('...') else memo1.Lines.Add('...'); |
#14
|
|||
|
|||
![]() Спасибо s0Creator за помощь.только что прилез из города.Снег метет как в Сибири...
Отдохну и попробую.Результаты сообщу обязательно. У меня тот самый WAD только 32-й.Там еще есть отдельное царство-государство - КР580ВВ55 - порт параллельного ввода-вывода. А адрес 307 это просто порт ее управляющего слова.На адресах ниже сидят ее порты А,В,С.Самое интересное,что из IsaBox Administrator'а все видно и все работает,а вот программно - ну никак... Уперлось ![]() Админу.Простите,пожалуйста.Я просто тегами здесь пользоваться не умею.Потому и получается у меня после команд везде где двоеточия торчат смайлики.Аж самому неудобно... |
#15
|
||||
|
||||
![]() Значит описание не то посмотрел.
Пробуй согласно своего. Я понял что не просто запись управляющего слова но и серия команд должна быть. для вставки тега выделяешь код и жмешь сверху # |