Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.10.2015, 12:23
OSIRIS OSIRIS вне форума
Прохожий
 
Регистрация: 04.01.2008
Сообщения: 11
Репутация: 10
По умолчанию работа с библиотекой LibFT4222.dll

собственно работаю через данную библиотеку с ft4222EV (мост USB-SPI)
все функции работают кроме одной, на ней просто зависает наглухо

из описания библиотеки:

FT4222_STATUS FT4222_SPIMaster_SingleReadWrite(FT_HANDLE ftHandle, uint8* readBuffer, uint8* writeBuffer, uint16 sizeToTransfer, uint16* sizeTransferred, BOOL isEndTransaction)

из моей программы:
Код:
Const
FT_DLL_Name4222 = 'LibFT4222.dll';

Type
FT_Result = Integer;
TValue=integer;
PSPI_BUFF=^string;
psizeTransferred=^integer;
pValue=^TValue;

function ft4222_SPI_send_read(ftHandle:Dword; readBuffer,writeBuffer :PSPI_BUFF; sizeToTransfer : integer; sizeTransferred : psizeTransferred; isEndTransaction : boolean) : FT_Result ; stdcall ; External FT_DLL_Name4222 name 'FT4222_SPIMaster_SingleReadWrite';

Function SPI_send_read(Serial_Number : string; read_data,send_data:PSPI_BUFF; sizeToTransfer:integer;sizeTransferred:psizeTransferred) :  FT_Result;

Function SPI_send_read(Serial_Number : string; read_data,send_data: PSPI_BUFF;sizeToTransfer:integer;sizeTransferred:psizeTransferred) :  FT_Result;
var
i:integer;
begin
i:=10;
Result := ft4222_SPI_send_read(FT_Handle,read_data, send_data, sizeToTransfer, sizeTransferred,true);
i:=sizeTransferred^;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i,k,l:integer;
rx,tx:PSPI_BUFF;
rxs,txs:string;
sizeTransferred:psizeTransferred;
begin
txs:='1';
k:=length(txs);
rx:=@rxs;
tx:=@txs;
sizeTransferred:=@l;
i:=SPI_send_read(serial,rx,tx,k,sizeTransferred);//вот тут либо виснет либо по указателю sizeTransferred выдает что то нереальное, но чаще виснет на корню
form1.Memo1.Lines.Add(rxs);
I:=sizeTransferred^;
form1.Memo1.Lines.Add(inttostr(i));
end;

если напутал с разделом - извиняюсь
библиотеку можно либо в нете найти либо могу ссылку скинуть как и на исходник целиком
Ответить с цитированием
  #2  
Старый 02.10.2015, 19:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну, потому что скорее всего ты что-то напутал с параметрами и в функцию передается мусор. Они либо вообще не понимает что тебе надо, либо возвращает тоже мусор.
Для начала - если у тебя D2009 или выше - то String использовать нельзя, т.к. он Unicode, т.е. двух-байтовый.
Далее, uint8 - это байт, uint16 - WORD. Т.е. для буферов, видимо, тебе надо просто указатель на какую-то память, для sizeToTransfer - WORD, для sizeTransferred - var WORD.
Т.е. основной вывод - неправильно описана сигнатура функции, вот тебе мусор и возвращается.
Ответить с цитированием
  #3  
Старый 05.10.2015, 10:19
OSIRIS OSIRIS вне форума
Прохожий
 
Регистрация: 04.01.2008
Сообщения: 11
Репутация: 10
По умолчанию

сижу в Embarcadero® RAD Studio XE 2010
соответственно вместо стринг ставить ansistring? (к слову изменение ничего не дает )
read_data и send_data по идее указывают как раз на переменную типа стринг ( по крайней мере так задумано )

"для sizeToTransfer - WORD, для sizeTransferred - var WORD" вот ту не понял если честно

Последний раз редактировалось OSIRIS, 05.10.2015 в 17:28.
Ответить с цитированием
  #4  
Старый 05.10.2015, 22:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Т.е. у тебя юникодные версии.
Соответсвенно, при использовании просто String, длинна передаваемых данных будет Length(String)*SizeOf(Char), где SizeOf(Char) возвращает 2. В принципе, если библиотека тоже юникодная, то она должна правильно понять переданную строку, но вот размер данных ты, походу, вычисляешь не првильно. Кроме того, в сигнатуре функции требуется передача массива байт. Строка, в принципе, может выступать как массив байт. Только для приема данных память надо выделять до вызова, а не надеяться, что функция ее выделит сама (в последнем случае параметр выглядел бы так: uint8** writeBuffer).
Теперь про WORD. uint16 - это 2-х байтовое беззнаковое целое, которое и есть WORD. В последнем случае массив, видимо, не предполагается. Соотв. это возвращаемое значение, которое можно сделать указателем, а можно - var, что заставит компилятор сделать именно указатель, но так пользоваться удобнее.
Ответить с цитированием
  #5  
Старый 07.10.2015, 11:47
OSIRIS OSIRIS вне форума
Прохожий
 
Регистрация: 04.01.2008
Сообщения: 11
Репутация: 10
По умолчанию

по прежнему не получается
попробовал через массив байт:
Код:
psizeTransferred=^byte;
PSPI_BUFF=^variant;

function ft4222_SPI_send_read(ftHandle:Dword; readBuffer,writeBuffer :PSPI_BUFF; sizeToTransfer : integer; sizeTransferred : psizeTransferred; isEndTransaction : boolean) : FT_Result ; stdcall ; External FT_DLL_Name4222 name 'FT4222_SPIMaster_SingleReadWrite';

procedure TForm1.Button3Click(Sender: TObject);
var
i,k,l:integer;
rx,tx:PSPI_BUFF;
rxs,txs:array [0..255] of byte;//ansistring;
sizeTransferred:psizeTransferred;
begin
FT_HANDLE:=get_handl;
txs[0]:=1;
txs[1]:=2;
txs[2]:=3;
txs[3]:=4;
k:=4;//length(txs);//*SizeOf(Char);
rx:=@rxs;
tx:=@txs;
sizeTransferred:=@l;
//i:=SPI_send_read(serial,rx,tx,k,sizeTransferred);//,sizeTransferred);
i:=ft4222_SPI_send_read(FT_HANDLE,rx,tx,k,sizeTransferred,true);
//form1.Memo1.Lines.Add(bytetostr(rxs[0]));
I:=sizeTransferred^;
form1.Memo1.Lines.Add(inttostr(i));
end;

в случае k:=1 проходит вроде норм, но в приеме не вижу того же значения

если k:=4 то висит

в случае
Код:
rx:=@rxs[0];
tx:=@txs[0];
результат не меняется


кстати говоря вот такой код из qt-creator работает:
Код:
uint16 sizeTransferred;
std::vector<unsigned char> sendBuf;
std::vector<unsigned char> recvBuf;

ft_status = FT4222_SPIMaster_SingleReadWrite(ftHandle,&recvBuf[0],&sendBuf[0], sendBuf.size(), &sizeTransferred, true);

там берется функция через хидер:
LIBFT4222_API FT4222_STATUS FT4222_SPIMaster_SingleReadWrite(FT_HANDLE ftHandle, uint8* readBuffer, uint8* writeBuffer, uint16 bufferSize, uint16* sizeTransferred, BOOL isEndTransaction);

Последний раз редактировалось OSIRIS, 07.10.2015 в 12:00.
Ответить с цитированием
  #6  
Старый 07.10.2015, 19:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Еще раз.
uint8* в данном случае это, например, Pointer или PAnsiChar
uint16 - это WORD
uint16* - это либо PWORD, либо var WORD.
Ответить с цитированием
  #7  
Старый 08.10.2015, 11:07
OSIRIS OSIRIS вне форума
Прохожий
 
Регистрация: 04.01.2008
Сообщения: 11
Репутация: 10
По умолчанию

попробовал, все равно зависает

function ft4222_SPI_send_read(ftHandle: Dword; readBuffer,writeBuffer :PAnsiChar; sizeToTransfer : word; sizeTransferred : PWORD; isEndTransaction : boolean) : FT_Result ; stdcall ; External FT_DLL_Name4222 name 'FT4222_SPIMaster_SingleReadWrite';

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
i,k,l:integer;
rx,tx:PAnsiChar;//PSPI_BUFF;
rxs,txs:ansistring;
sizeTransferred:PWORD;//psizeTransferred;
sizetotransfer:word;

begin
FT_HANDLE:=get_handl;
txs:='1';
k:=length(txs);//*SizeOf(Char);
sizetotransfer:=K;
rx:=@rxs;
tx:=@txs;
sizeTransferred:=@l;
//i:=SPI_send_read(serial,rx,tx,k,sizeTransferred);//,sizeTransferred);
i:=ft4222_SPI_send_read(FT_HANDLE,rx,tx,sizetotransfer,sizeTransferred,true);
form1.Memo1.Lines.Add(rxs);
I:=sizeTransferred^;
form1.Memo1.Lines.Add(inttostr(i));
end;

вот в таком виде не зависает:
function ft4222_SPI_send_read(ftHandle: Dword; readBuffer,writeBuffer :PSPI_BUFF; sizeToTransfer : int64; sizeTransferred : psizeTransferred; isEndTransaction : boolean) : FT_Result ; stdcall ; External FT_DLL_Name4222 name 'FT4222_SPIMaster_SingleReadWrite';
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
i,k,l:integer;
rx,tx:PSPI_BUFF;
rxs,txs:array [0..255] of byte;//ansistring;
sizeTransferred:psizeTransferred;
sizetotransfer:int64;
b:string;

begin
FT_HANDLE:=get_handl;
txs[0]:=1;
txs[1]:=1;
txs[2]:=1;
txs[3]:=1;
txs[4]:=1;
txs[5]:=1;
k:=length(txs);//*SizeOf(Char);
sizetotransfer:=6;
rx:=@rxs;
tx:=@txs;
sizeTransferred:=@l;
//i:=SPI_send_read(serial,rx,tx,k,sizeTransferred);//,sizeTransferred);
i:=ft4222_SPI_send_read(FT_HANDLE,rx,tx,sizetotransfer,sizeTransferred,true);
setlength(b,2);
//b[1]:=int(rxs[0]);
//b[2]:=int(rxs[1]);
//form1.Memo1.Lines.Add(b);
I:=sizeTransferred^;

end;

но функция возвращает ошибку 1009, что это пока не нашел (
отправка так же не происходит

Последний раз редактировалось OSIRIS, 08.10.2015 в 18:59.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter