电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

EZ-USB control panel上位机程序(转)

1,首先,我们要打开设备,怎么打开呢?当然是用函数了!这还用问。。
我们要用bOpenDriver (HANDLE * phDeviceHandle, PCHAR devname)来打开这个设备获得一个句柄,这个函数你可以在EzMain.cpp文件的第1343行找到,通过这个句柄就可以操作设备了,恩,太简单了!
2,有了这个句柄,下面我们就可以对设备读写了,怎么读写呢?用函数啊。。
打开Control Panel,你会看见界面上方有好多小方块,好像学名叫做“按钮”,每个按钮会对应一个消息,对应的消息在那里呢?从EzMain.cpp的第196行开始(哇,好多。。),每一个Case代表一个按钮事件,也就是说点了那个按钮,程序就会执行到这里(废话。。),下面我们来举例解释具体该怎么操作。
3,以获得设备描述符操作为例,也就是case IDC_GETDEVICEDESCRIPTOR:事件,你会在EzMain.cpp的第545行找到它,步骤如下:
pvBuffer = malloc (sizeof (Usb_Device_Descriptor) + 128);//存放描述符的缓冲区(不明白的找块豆腐撞死吧)
MAINTAIN_OUTPUT_BOX (hOutputBox, nItems);//没用,不理
if (bOpenDriver (&hDevice, pcDriverName) != TRUE)//打开设备获得句柄
{
EzSendMessage (hOutputBox, LB_ADDSTRING, 0, (LPARAM)"Failed to Open Driver");
hDevice = NULL;
}
if (hDevice != NULL)//如果句柄不是空的
{// Perform the Get-Descriptor IOCTL//著名的Ioctl函数,什么?你没听说过!
bResult = DeviceIoControl (hDevice,//句柄,之前已经得到了
IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR,//CTL_CODE,告诉驱动你要获得描述符
pvBuffer,//输入数据缓冲区,这里没用
sizeof (Usb_Device_Descriptor),//输入数据数量
pvBuffer,//输出缓冲区,接收从设备返回的数据
sizeof (Usb_Device_Descriptor),//输出缓冲区的长度
(unsigned long *)&nBytes,//实际返回的数据长度
NULL);//没用
}/* if valid driver handle */
如果上面这个函数执行成功,那么设备描述符数据就会放到pvBuffer中,你要做的就是从缓冲区中析取描述符中的item,然后显示出来即可,根据协议规定很容易的,下面的几行程序就是做这个用的,我就不解释了。
完事后要处理善后,就像上完厕所要冲水一样(好恶心。。)
CloseHandle (hDevice); // 关闭设备句柄
free (pvBuffer); // 释放缓冲区
4,还有15分钟下班,简单讲一下最重要的BULK传输吧,时间不多,简单说一下,嘻嘻。
你会在EzMain。cpp的第666行找到这个case,一个十分吉利的数字!
其他一些建立缓冲区什么设置数据长度什么的都不说了,就说重点的
BULK_TRANSFER_CONTROL bulkControl;
//这个结构里存放了端点的信息,即你要使用哪个端点,这个端点信息是从界面上得到的,下面的几行程序向你展示了如何从界面上获得它。
//然后是分配缓冲区,设置长度等乱七八糟的事
if (bOpenDriver (&hDevice, pcDriverName) != TRUE)//然后是打开设备
if (hDevice != NULL)//判断句柄
PUSBD_PIPE_INFORMATION pPipe = ((PUSBD_INTERFACE_INFORMATION)theApp.m_uInterfaceInfo)->Pipes;//获得端点信息
DWORD ioctl_val = IOCTL_EZUSB_BULK_WRITE;//预设CTL_CODE参数为写,就是向设备写数据
if(pPipe[bulkControl.pipeNum].EndpointAddress >> 7)//如果端点地址的最高位是1,那么是读,就是0x80,0x82什么的
ioctl_val = IOCTL_EZUSB_BULK_READ;//设置CTL_CODE参数为读,就是从设备读取数据
bResult = DeviceIoControl (hDevice,//著名的ioctl函数
ioctl_val, //CTL_CODE参数,标志你是从设备读数据还是向设备写数据
&bulkControl,//传入参数,我们此处传入要使用的端点号
sizeof (BULK_TRANSFER_CONTROL),//传入参数的大小
buffer,//读写数据的缓冲区
length,//读写数据的长度
(unsigned long *)&nBytes,//驱动实际返回的数据长度
NULL);//没用
//然后下面就是显示数据等乱七八糟的事情了,没啥用,爱看不看
//上完厕所要冲水!
#ifndef USING_MFC
free(buffer);
#endif
CloseHandle (hDevice);
其它类似,大家可以自己弄了,根据上面的讲解,如果你想自己写个程序,把里面重要的东西弄出来就OK了,当然,别忘了包含主要的头文件,比如ezusbsys.h,以及把相应的一些结构变量给弄到你的程序里,像我这种只会三斧半VC的人都能搞定,对你们还有啥难的吗?

博主
lyan1989@163.com
lyan1989's Blog
lyan1989
点击跳转