начнем сначала
прототип функции (в С)
Цитата:
Код:
char W_IO(char Address, char Cmd, int BodyLen, void *CmdBody, int *ReplyLen, void *ReplyBuffer);
|
аргументы такие:
Цитата:
Address:byte;
Cmd:byte;
BodyLen:integer;
CmdBody:Pointer;
ReplyLen:Pinteger;
ReplyBuffer:Pointer
|
соответственно прототип в Delphi:
Код:
function W_IO(Adress:byte;Cmd:byte;BodyLen:integer; CmdBody:Pointer;ReplyLen:Pinteger;ReplyBuffer:Pointer):byte;stdcall
т.е. функции нужны:
адрес устройства,
команда для устройства,
размер буфера аргументов команды для устройства,
указатель на буфер с аргументами команды для устройства,
указатель на длину буфера для приема,
указатель на сам буфер для приема
работа с функцией:
Код:
...
var
...
ReplyLen:integer;
ReplyBuffer:Pointer;
...
begin
//определяем размер буфера и выделяем под него память
ReplyLen:=$FF;
ReplyBuffer:=GetMemory(ReplyLen);
//если нужен цикл, то начало цикла тут
// начало цикла
...
Ret := W_IO(#$1, #$00, 0, '', @ReplyLen, ReplyBuffer);
if Ret = REPLY_OK then
begin
Edit1.Text:='Команда выполнена успешно, получены данные';
Edit2.Text:=PChar(ReplyBuffer);// PChar(GetMemory(ReplyLen));как у вас - бред, пытаемся просто отбразить только что выделеную память
end;
...
// тут конец цикла
...
FreeMemory(ReplyBuffer);// в конце освобождаем память
end;
после вызова этой функции и передачи ей необходимых параметров, функция кушает адрес устройства, команду и аргументы команды (согласно размеру буфера аргументов), отправляет все это на устройство и закидывает по адресу буфера ответа пришедший ответ от устройства (видимо еще проводит проверку на достаточность длины буфера) и в своем результате показывает результат выполнения, т.е. REPLY_OK и т.п., т.е. после вызова этой функции и проверки возвращаемого результата необходимо смотреть в буфере ответа ответ от устройства
для того, чтобы этот результат был в виде
Цитата:
31 33 20 4D 48 7A 20 52 65 61 64 65 72
|
необходимо "расшифровывать" буфер
З.Ы. как вариант функция сама определяет ReplyBuffer и ReplyLen и все выделения памяти в программе не нужны, тогда как dll освобождает память после ее использования?
З.Ы.Ы. или закручено еще круче: функция после своей работы выбрасывает по адресу ReplyLen длину необходимого ей буфера, а при следующем своем вызове заполняет его (или какой-то другой функцией), но это из области фантазий - нужно смотреть докуметацию или коментарии к библиотеке, если таковые есть
З.Ы.Ы.Ы а может проще написать свой класс работы с СОМ портом, тем более протокол известен, кто знает какие там ошибки в dll а так, если не работает - сам дурак
