Leonwe
驱动牛犊
驱动牛犊
  • 注册日期2001-06-06
  • 最后登录2005-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1593回复:7

谁要能帮我搞定,我愿意放血!

楼主#
更多 发布于:2002-05-14 19:54
还没结果,呜呜.....

最新喜欢:

qgrqgr
Leonwe
驱动牛犊
驱动牛犊
  • 注册日期2001-06-06
  • 最后登录2005-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-14 19:57
还没结果,呜呜.....


我正在开发的基于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_valWORD;
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;


lcy
lcy
驱动牛犊
驱动牛犊
  • 注册日期2001-07-17
  • 最后登录2005-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-14 20:13
你用谁的驱动程序了,你自己的吗?下位机程序下栽不是你这样下栽的吧!!!!!,哈哈,给我分,因为我也实在没分了
liuxf66
驱动中牛
驱动中牛
  • 注册日期2001-08-15
  • 最后登录2003-04-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-14 22:35
另外,你怎么会下载Bix代码呢?你的2131的firmware是用什么编译的?难道不是keil51吗?如果是,应该下载*.HEX文件才行!
liuxf66
Leonwe
驱动牛犊
驱动牛犊
  • 注册日期2001-06-06
  • 最后登录2005-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-15 09:50
我用的是Cypress 的 EZUSB(AN2131),使用它的驱动程序(ezusb.sys),我要在我的Delphi程序里通过EP2out端口以Bulk模式读写数据,可是DeviceIOControl函数一直返回False!
现在最急的是Bulk传输的那段子程序(下载哪段可稍缓)不能工作。下载Bix文件的问题,我已通过调用自己包装的C++格式的DLL完成了。
我获取设备描述符、配置描述符、接口管道描述符都已正常。
现在想用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。
其它参数应该没问题的呀?

关于DeviceIoControl函数: 在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;

小子我不懂C/C++,我不能理解Cypress提供的C++程序!不考虑VB。

――――――――――――――――
帮帮我!急得头上冒泡!如果调试通过,我将把我的这个Delphi小程序的源代码,完全奉献给大家品评。谢了。

――――――――――――――――
只有不到一个月的时间了,还没进展!用过EZUSB(AN2131QC)和精通Delphi的朋友,若能帮助解决“BULK 输入输出”的问题,我愿意放血!
――――――――――――――――
Leonwe Leonwe@sohu.com 200205150950。
liuwan
驱动小牛
驱动小牛
  • 注册日期2001-10-15
  • 最后登录2004-04-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-15 17:40
深表同情!不过俺也不懂DELPHI,我们这边PC端应用使用VB写的,但驱动是DDK开发的,使用正常。可惜帮不了你。
菜菜
WOOD
驱动老牛
驱动老牛
  • 注册日期2001-09-14
  • 最后登录2008-06-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-15 19:15
首先你的BUFFER里的值肯定是ASCII值,这与你的要求不符,需要写段程序自己转换。关于BUFFER的类型,我认为你现在定义的方法就可以了。我不会用DELPHI,只是根据我用C的经验提供一点建议。另外我也不知道,DELPHI是怎样对WINDOWS API封装的,总是感觉你那个DEVICEIOCONTROL的参数和C里面的不一样。
Leonwe
驱动牛犊
驱动牛犊
  • 注册日期2001-06-06
  • 最后登录2005-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-05-20 12:32
我不用放血了!终于自己搞定了。
如此搞定:用VC++6将要用的下载Bix文件、Bulk数据输入输出、获取管道信息等做成DLL(or Lib),在Delphi6里调用,只能先这样了!
我一直强烈的认为我的几段Delphi源程序没有问题,因为我将他们翻译成VB/VC,都能很好的工作,那么只有可能是----Delphi的问题?Delphi包装的API函数DeviceIoControl有问题???
function DeviceIoControl(
hDevice: THandle;
dwIoControlCode: DWORD;
lpInBuffer: Pointer;
nInBufferSize: DWORD;
lpOutBuffer: Pointer;
nOutBufferSize: DWORD;
var lpBytesReturned: DWORD; // <<< var 是按引用传值,类似C++的\"&\"
lpOverlapped: POverlapped): BOOL; stdcall;
但是在Delphi里用此函数获取设备描述符、配置描述符、接口管道信息等都已经非常正确,到底为什么,有待研究!
游客

返回顶部