直接上代码,各位看看,调用时总是失败,调用GetLastError时错误码是87(参数错误)//---------------------------------------定义
BULK_TRANSFER_CONTROL=record
pipeNum:Cardinal;//对应ULONG
end;
m_Usb_Handle:THandle;//已经成功打开
//功能码是对的
function IOCTL_EZUSB_BULK_WRITE:DWORD;
begin
result:=CTL_CODE(FILE_DEVICE_UNKNOWN,Ezusb_IOCTL_INDEX+20,METHOD_IN_DIRECT,FILE_ANY_ACCESS);
end; dataBuffer:Array[0..32] of Char;
dataBufferSize,lpBytesReturned:DWORD;
outBulkControl:BULK_TRANSFER_CONTROL;
outPBulkControl:Pointer;//--------------------------------调用代码
//要下发16个字节的 1
dataBufferSize:=16;
for i:=0 to dataBufferSize-1 do
begin
dataBuffer[i]:=#1;
//dataBuffer[2*i]:='1';
//dataBuffer[2*i+1]:='1';
//dataBuffer[2*i+2]:=#0;
end; outBulkControl.pipeNum:=2; //输出端点 0 Endpoint: 2 OUT
outPBulkControl:=@outBulkControl;
if (m_Usb_Handle<>Windows.INVALID_HANDLE_VALUE) then
begin
lpBytesReturned:=0;
if DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE,outPBulkControl,SizeOf(BULK_TRANSFER_CONTROL),
@dataBuffer,dataBufferSize,lpBytesReturned,nil) then
begin
//发送成功
Memo1.Lines.Add(Format('发送数据成功 Result=%d',[lpBytesReturned]));
end
else begin
iErrorCode:=windows.GetLastError;
Memo1.Lines.Add(Format('发送数据失败 ErrorCode=%d(%s) Result=%d OutBufferSize=%d',[iErrorCode,getErrorTextByCode(iErrorCode),lpBytesReturned,dataBufferSize]));
// GetLastError =87 〖87〗-参数错误。
end;//执行后输出的结果是:打开USB成功
发送数据失败 ErrorCode=87(参数错误) Result=0 OutBufferSize=16
Data->> 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
关闭USB成功
***** IOCTL_Ezusb_GET_PIPE_INFO ******
获得端口点列表数据成功 Result=56
Pipe Endpoint Direction Type Size
0 2 IN BLK 16
1 6 OUT BLK 512请大家帮我看看,谢谢,分数我尽量多点,我的分也不多
BULK_TRANSFER_CONTROL=record
pipeNum:Cardinal;//对应ULONG
end;
m_Usb_Handle:THandle;//已经成功打开
//功能码是对的
function IOCTL_EZUSB_BULK_WRITE:DWORD;
begin
result:=CTL_CODE(FILE_DEVICE_UNKNOWN,Ezusb_IOCTL_INDEX+20,METHOD_IN_DIRECT,FILE_ANY_ACCESS);
end; dataBuffer:Array[0..32] of Char;
dataBufferSize,lpBytesReturned:DWORD;
outBulkControl:BULK_TRANSFER_CONTROL;
outPBulkControl:Pointer;//--------------------------------调用代码
//要下发16个字节的 1
dataBufferSize:=16;
for i:=0 to dataBufferSize-1 do
begin
dataBuffer[i]:=#1;
//dataBuffer[2*i]:='1';
//dataBuffer[2*i+1]:='1';
//dataBuffer[2*i+2]:=#0;
end; outBulkControl.pipeNum:=2; //输出端点 0 Endpoint: 2 OUT
outPBulkControl:=@outBulkControl;
if (m_Usb_Handle<>Windows.INVALID_HANDLE_VALUE) then
begin
lpBytesReturned:=0;
if DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE,outPBulkControl,SizeOf(BULK_TRANSFER_CONTROL),
@dataBuffer,dataBufferSize,lpBytesReturned,nil) then
begin
//发送成功
Memo1.Lines.Add(Format('发送数据成功 Result=%d',[lpBytesReturned]));
end
else begin
iErrorCode:=windows.GetLastError;
Memo1.Lines.Add(Format('发送数据失败 ErrorCode=%d(%s) Result=%d OutBufferSize=%d',[iErrorCode,getErrorTextByCode(iErrorCode),lpBytesReturned,dataBufferSize]));
// GetLastError =87 〖87〗-参数错误。
end;//执行后输出的结果是:打开USB成功
发送数据失败 ErrorCode=87(参数错误) Result=0 OutBufferSize=16
Data->> 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
关闭USB成功
***** IOCTL_Ezusb_GET_PIPE_INFO ******
获得端口点列表数据成功 Result=56
Pipe Endpoint Direction Type Size
0 2 IN BLK 16
1 6 OUT BLK 512请大家帮我看看,谢谢,分数我尽量多点,我的分也不多
pBULK_TRANSFER_CONTROL = ^BULK_TRANSFER_CONTROL
把outPBulkControl聲明為pBULK_TRANSFER_CONTROL
outPBulkControl^ := outBulkControl
BULK_TRANSFER_CONTROL=record
pipeNum:Cardinal;//对应ULONG
end;
PBULK_TRANSFER_CONTROL=^BULK_TRANSFER_CONTROL; outPBulkControl:PBULK_TRANSFER_CONTROL; outPBulkControl:=new(PBULK_TRANSFER_CONTROL);
outPBulkControl.pipeNum:=2;
这部分我已经修改成这样子,还是不行的
DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE, @outBulkControl,SizeOf(BULK_TRANSFER_CONTROL),
@dataBuffer,dataBufferSize,lpBytesReturned,nil)
if DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE, @outBulkControl,SizeOf(BULK_TRANSFER_CONTROL),@dataBuffer,dataBufferSize,lpBytesReturned,nil) <>0 then
...//成功
else
...//失敗
2、BOOL和Boolean還是有區別的綜上兩點,所以建議換判斷方法...
只能传DWORD或Cardinal类型的,不能传指针
**************************写数据...
发送数据成功 Result=16
Data->> 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
**************************读数据...
读取数据成功 Result=512
Data->>
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 A6 E1 32 07 90 82 76 01 95 FA 00 D9 92 3F E5 9F 39 FD 3D 8A FF 07 F3 56 DF 4D 38 FA C9 8F 05 B3 29 C8 F9 4A FE 7A 9E 0B FC 3F 1C 2B 4A 5B 23 A4 00 48 C7 91 BF 51 AB 16 F1 B0 52 B6 4C 40 21 51 C3 00 CF AE E5 43 D3 0C 9F 6B 44 E3 C2 E7 10 7F 46 0C B4 C6 FB 0D 92 11 3F 77 A8 66 CC D0 0C 3E 0A A5 DE 4F C3 88 D3 29 4F 3D 49 13 44 3F B4 63 08 00 F3 D2 BD 32 BE 21 72 18 A1 8A 17 A6 40 9A 80 2A F3 97 AC 4B 48 40 EF BF 4E CB 94 07 11 E4 03 0F F2 94 EF B8 B7 99 46 59 1A F3 6D FF EB 39 30 4A 6F 60 B9 26 EA 41 9D FB 50 FC 5A DC 99 99 78 0E 74 23 D3 92 6A 8C 7E CA 87 6B 01 16 90 A3 DD C9 9F 00 45 20 BC 10 9D 3F CF BF C2 D6 C9 4E 0C 8E 6F 18 57 56 FD 23 DF 4B 03 4F 06 3B 62 FF 6C 89 FF CC F2 6A BB CB EE BD 02 C9 C9 7E 53 4E 67 42 94 91 DF 45 E3 C0 6A CA A0 FB 53 E7 35 D5 90
**************读写操作1次,所用时间 31 ms
**读操作成功1次,失败0次 **写操作成功1次,失败0次
关闭USB成功