阅读:2087回复:13
在Delphi应用程序中对EZUSB进行Bulk传输
我正在开发的基于USB接口的测试设备,PC应用程序利用delphi编程,由于延续性问题,现无法更改用VC/VB等编程。但现在CYpress提供的他的控制面板程序的源程序及其它上位机例子程序给出的都是VC或VB代码,我从未系统学过C/C++,这些天我一直在试图理解C++代码并翻译到Delphi,尽管已经认为基本读懂范例中的代码,但我的Delphi程序在通过调用DeviceIoControl实现下载Bix文件、Bulk传输输入输出数据时总是失败。因项目开发时间关系,现非常需要大家的帮助,哪位仁兄精通EZUSB(AN2131)和Delphi的人,帮我的delphi源代码调试通?
先致以真诚的谢意! <1>.在我的Delphi5应用程序中,获取设备描述符、配置描述符、接口管道信息 都已经非常正确, 但下载 Bix 文件(到AN2131里去)却始终不能成功; <2>.已有一个经“Cypress控制面板程序”验证能正常Bulk输入输出的Bix 文件, 在我自己的Delphi5应用程序中不能成功。 以上2问题在调试跟踪时,DeviceIoControl 函数总是返回False,是否此函数的参数我送的不对? 我的程序段(Delphi 5)如下: procedure TForm1.BtnDownloadClick(Sender: TObject); // 下载 Bix 文件到AN2131里去 const MAX_FILE_SIZE = (1024*7); var hDevice: THandle; bResult: Boolean; nBytes: Longword; F: file; wFileSize,NumRead: LongWord ; Buffer: array[1..MAX_FILE_SIZE] of Byte; DownloadFilename: string; begin if not(bOpenDriver(hDevice, pcDriverName)) then exit; // hDevice:取得的设备的句柄 if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); FileMode := 0; // Set file access to read only Reset(F,1); // Record size = 1 wFileSize:= FileSize(F); // 获取文件长度 BlockRead( F, Buffer, wFileSize, NumRead ); CloseFile(F); end; // end of OpenDialog1.Execute bResult := DeviceIoControl (hDevice, IOCTL_Ezusb_ANCHOR_DOWNLOAD, // ???????????????????????? 这个IOCTL 应该没错的 @buffer, // 包含文件内容(字节)的缓冲区的指针,????????????错了么? numread, // 缓冲区的长度,??????????????????????????????????错了么? nil, 0, nBytes, nil); // 为什么 DeviceIoControl 函数总是返回False ???????????????????????????????????? if(not bResult) then showmessage(\'Anchor 固件下载失败\'); CloseHandle (hDevice); end; // ★★★★★★★★★★★★★★★★★★★★ procedure TForm1.BtnBulk1Click(Sender: TObject); // Bulk传输,将文本框Edit2里的字符内容,通过端点2OUT送到AN2131里去 type _BulkBuffer = array[0..63] of char; pBulkBuffer = ^_BulkBuffer; var sTmp:string; iTmp:integer; pipeID: ULONG; Buffer: pBulkBuffer; Size: Byte; dataLen: DWORD; InterfaceInfo:USBD_INTERFACE_INFORMATION; ioctl_val:DWORD; bulkControl:BULK_TRANSFER_CONTROL; nBytes: DWORD; bResult: Boolean; begin if not(bOpenDriver(hDevice, pcDriverName)) then exit; Size := Edit2.GetTextLen; Inc(Size); GetMem(Buffer, Size); // 申请内存 Edit2.GetTextBuf(Buffer^,Size); // 将文本框Edit2的字符内容送到Buffer所指的内存区域 dataLen:= Size; // pipeID := 2; // 选择第 2 号管道,Endpoint 2 OUT,BULK模式 bulkControl.pipeNum:= pipeID; bResult := GetInterfaceInfo(hDevice, InterfaceInfo, nBytes); if (not bResult) then showmessage(\'获取接口信息出错\'); If (InterfaceInfo.Pipes[pipeID].EndpointAddress > 128) Then ioctl_val:= IOCTL_EZUSB_BULK_READ // 读 else ioctl_val:= IOCTL_EZUSB_BULK_WRITE; // 写 nBytes:= 0; bResult := DeviceIoControl(hDevice, ioctl_val, @bulkControl, // 指向 BULK_TRANSFER_CONTROL 结构的指针 Sizeof(BULK_TRANSFER_CONTROL), // BULK_TRANSFER_CONTROL 结构的长度 Buffer, // 指向Bulk传输(收/发)缓冲区的指针,????????????错了么? dataLen, // 缓冲区长度,?????????????????????????????????错了么? nBytes, // 0); if(not bResult) then showmessage(\'Bulk传输失败\'); // 为什么 DeviceIoControl 函数总是返回False ???????????????????????????????????? CloseHandle (hDevice); // 关设备 FreeMem(Buffer); // 释放内存 end; |
|
最新喜欢:sunmac... |
沙发#
发布于:2002-05-11 22:22
DEVICE_IO_CONTROL的参数传递不对
|
|
板凳#
发布于:2002-05-11 23:00
你程序中的bResult := DeviceIoControl (hDevice, IOCTL_Ezusb_ANCHOR_DOWNLOAD, // ???????????????????????? 这个IOCTL 应该没错的 @buffer, // 包含文件内容(字节)的缓冲区的指针,????????????错了么? numread, // 缓冲区的长度,??????????????????????????????????错了么? nil, 0, nBytes, nil); 有问题 可改为bResult := DeviceIoControl (hDevice, IOCTL_Ezusb_ANCHOR_DOWNLOAD, &downloadControl, //指向 ANCHOR_DOWNLOAD_CONTROL结构的指针 sizeof(ANCHOR_DOWNLOAD_CONTROL), @buffer, numread, nBytes, nil); 试一试 |
|
|
地板#
发布于:2002-05-12 09:17
关注,快试试呀,把结果写一下让我们看看! :D
|
|
|
地下室#
发布于:2002-05-12 09:58
DEVICE_IO_CONTROL的参数传递不对 :( :( :( :( :( :( :( :( 哪些个参数不对?是Buffer吗?似乎最总要的就是Buffer及其长度了。 现在最急的是 Bulk传输的那段子程序(下载哪段可稍缓)。 我获取设备描述符、配置描述符、接口管道描述符都已正常。 现在想用Bulk传输,通过endpoint2 OUT端点,把文本框(edit2)里的内容“85”(16进制=“55h”)送到EZUSB(AN2131)里,控制 PB口的8只LED按“55h”的要求发光。 是否在调用DeviceIoControl前我的Buffer里的内容有误?Buffer里应该是ASCII码(35h,35h),还是数字(55 or 85)? Buffer应该定义成和种类型?pchar,char,byte,array[0..x] of char,array[1..x] of char,array[0..x] of Byte,还是其它? Buffer的长度呢?按ASCII码算应是2,按Hex值算应是1。 其它参数应该没问题的呀? ―――――――――――――――― 帮帮我!急得头上冒泡!如果调试通过,我将把我的这个Delphi小程序的源代码,完全奉献给大家品评。谢了。 Leonwe Leonwe@sohu.com 200205121005。 |
|
5楼#
发布于:2002-05-12 10:43
首先申明,本人不懂delphi,只懂vc。但语言是大致是相通的,再看了一下你的程序,在vc中DeviceIoControl函数中的第七个参数(即返回字节数)是LPDWORD型,即一个指针,而你程序中似乎不是 ,再改改试试,buffer定义成char似乎是可以的(vc下)
|
|
|
6楼#
发布于:2002-05-12 10:51
首先申明,本人不懂delphi,只懂vc。但语言是大致是相通的,再看了一下你的程序,在vc中DeviceIoControl函数中的第七个参数(即返回字节数)是LPDWORD型,即一个指针,而你程序中似乎不是 ,再改改试试,buffer定义成char似乎是可以的(vc下) 不对,在Windows API原型这里应是指针,但是Delphi的Windows.pas里对这个API包装后的函数声明是: function DeviceIoControl( hDevice: THandle; dwIoControlCode: DWORD; lpInBuffer: Pointer; nInBufferSize: DWORD; lpOutBuffer: Pointer; nOutBufferSize: DWORD; var lpBytesReturned: DWORD; // <<<<<<<<<< lpOverlapped: POverlapped): BOOL; stdcall; 就是说这个参数是按变量传递的参数,这个参数须是DWORD型,不是指针了。改成指针反而编译通不过了,可能问题的关键不在这里。 |
|
7楼#
发布于:2002-05-12 12:50
你现在到底是通过bulk发出去的数和预想的不一样还是调用DeviceIoControl失败
|
|
|
8楼#
发布于:2002-05-12 13:45
见crazy大大的回复,我的修改意见也是一样的
|
|
9楼#
发布于:2002-05-13 00:40
你现在到底是通过bulk发出去的数和预想的不一样还是调用DeviceIoControl失败 应该是DeviceIoControl失败 (返回值false) |
|
10楼#
发布于:2002-05-14 08:51
后来呢?结果怎样
|
|
11楼#
发布于:2002-05-20 12:40
后来灰姑娘和王子过着无忧无虑的生活......
;) 结果请参见我(Leonwe)的回复(2002-05-20 12:45)。 |
|
12楼#
发布于:2002-05-20 15:53
Lenowe,能不能把你dll的源程序给我一份,谢谢。
我的邮箱:zyyaxmyy@yahoo.com.cn |
|
13楼#
发布于:2003-11-26 16:14
能不能给我发一份获得USB设备路径名相关的一段程序,我也在用Delphi开发USB控制程序,但调用SetupDiEnumDeviceInterfaces等几个API函数总是调用不成功
|
|