|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
работа с библиотекой 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
|
|||
|
|||
ну, потому что скорее всего ты что-то напутал с параметрами и в функцию передается мусор. Они либо вообще не понимает что тебе надо, либо возвращает тоже мусор.
Для начала - если у тебя D2009 или выше - то String использовать нельзя, т.к. он Unicode, т.е. двух-байтовый. Далее, uint8 - это байт, uint16 - WORD. Т.е. для буферов, видимо, тебе надо просто указатель на какую-то память, для sizeToTransfer - WORD, для sizeTransferred - var WORD. Т.е. основной вывод - неправильно описана сигнатура функции, вот тебе мусор и возвращается. |
#3
|
|||
|
|||
сижу в Embarcadero® RAD Studio XE 2010
соответственно вместо стринг ставить ansistring? (к слову изменение ничего не дает ) read_data и send_data по идее указывают как раз на переменную типа стринг ( по крайней мере так задумано ) "для sizeToTransfer - WORD, для sizeTransferred - var WORD" вот ту не понял если честно Последний раз редактировалось OSIRIS, 05.10.2015 в 17:28. |
#4
|
|||
|
|||
Т.е. у тебя юникодные версии.
Соответсвенно, при использовании просто String, длинна передаваемых данных будет Length(String)*SizeOf(Char), где SizeOf(Char) возвращает 2. В принципе, если библиотека тоже юникодная, то она должна правильно понять переданную строку, но вот размер данных ты, походу, вычисляешь не првильно. Кроме того, в сигнатуре функции требуется передача массива байт. Строка, в принципе, может выступать как массив байт. Только для приема данных память надо выделять до вызова, а не надеяться, что функция ее выделит сама (в последнем случае параметр выглядел бы так: uint8** writeBuffer). Теперь про WORD. uint16 - это 2-х байтовое беззнаковое целое, которое и есть WORD. В последнем случае массив, видимо, не предполагается. Соотв. это возвращаемое значение, которое можно сделать указателем, а можно - var, что заставит компилятор сделать именно указатель, но так пользоваться удобнее. |
#5
|
|||
|
|||
по прежнему не получается
попробовал через массив байт: Код:
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
|
|||
|
|||
Еще раз.
uint8* в данном случае это, например, Pointer или PAnsiChar uint16 - это WORD uint16* - это либо PWORD, либо var WORD. |
#7
|
|||
|
|||
попробовал, все равно зависает
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. |