阅读:1471回复:12
现在终于可以了
现在可以打开USB设备,但是要想和 USB设备通信,我们还必须打开相应的USB端口,我上面的程序就是在打开设备的情况下来打开USB端口的,以便我可以对USB设备进行读写,如果没有上面的函数,我们如何对USB设备进行读写呢?我这里的port是指USB端口,比如端口1:PIPE1
[编辑 - 7/30/03 by duanjong] [编辑 - 7/30/03 by duanjong] |
|
最新喜欢:![]() |
沙发#
发布于:2003-07-30 15:09
我也是那样用的,现在可以打开USB设备,但是要想和 USB设备通信,我们还必须打开相应的USB端口,我上面的程序就是在打开设备的情况下来打开USB端口的,以便我可以对USB设备进行读写,如果没有上面的函数,我们如何对USB设备进行读写呢?我这里的port是指USB端口,比如端口1:PIPE1
|
|
板凳#
发布于:2003-07-30 15:06
我也是那样用的,现在可以打开USB设备,但是要想和 USB设备通信,我们还必须打开相应的USB端口,我上面的程序就是在打开设备的情况下来打开USB端口的,以便我可以对USB设备进行读写,如果没有上面的函数,我们如何对USB设备进行读写呢?
|
|
地板#
发布于:2003-07-30 14:51
打开设备的路径是functionClassDeviceData->DevicePath,你为什么又加上一个port?port是什么东西,是端口号吗?不是这样用的啦,直接用functionClassDeviceData->DevicePath作为CreatFile()的第一个参数!!!我前面的例程里不是写得很清楚吗
|
|
地下室#
发布于:2003-07-30 14:41
现在可以打开USB设备,其实我的GUID 是对的,主要是程序的问题,缺少一条关键语句,谢谢你,给你20分以致鼓励,但现在打开USB端口失败,函数如下:
void CUSB_RD_WRDlg::OpenUsbPort(CString port) { char completeDeviceName[256] =\"\" ; if(functionClassDeviceData->DevicePath != NULL) { strcat(completeDeviceName,functionClassDeviceData->DevicePath); strcat(completeDeviceName,port); hUsbPort = CreateFile(completeDeviceName, GENERIC_READ|GENERIC_WRITE, //Specifies the type of access to the object FILE_SHARE_READ|FILE_SHARE_WRITE,//Specifies how the object can be shared NULL, //Ignored; set to NULL OPEN_EXISTING, //Specifies which action to take on files that exist 0, //Specifies the file attributes and flags for the file NULL); if(hUsbPort==INVALID_HANDLE_VALUE) { AfxMessageBox(\"打开USB端口失败,请确认各项参数设置是否正确???\"); // return false; } } else AfxMessageBox(\"获得设备端口失败,请检查USB设备或端口是否连接正确???\"); } [编辑 - 7/30/03 by duanjong] |
|
5楼#
发布于:2003-07-30 14:38
现在可以打开USB设备,但打开USB端口失败,函数如下:
void CUSB_RD_WRDlg::OpenUsbPort(CString port) { char completeDeviceName[256] =\"\" ; if(functionClassDeviceData->DevicePath != NULL) { strcat(completeDeviceName,functionClassDeviceData->DevicePath); strcat(completeDeviceName,port); hUsbPort = CreateFile(completeDeviceName, GENERIC_READ|GENERIC_WRITE, //Specifies the type of access to the object FILE_SHARE_READ|FILE_SHARE_WRITE,//Specifies how the object can be shared NULL, //Ignored; set to NULL OPEN_EXISTING, //Specifies which action to take on files that exist 0, //Specifies the file attributes and flags for the file NULL); if(hUsbPort==INVALID_HANDLE_VALUE) { AfxMessageBox(\"打开USB端口失败,请确认各项参数设置是否正确???\"); // return false; } } else AfxMessageBox(\"获得设备端口失败,请检查USB设备或端口是否连接正确???\"); } |
|
6楼#
发布于:2003-07-30 13:57
你用2里面的guid不能打开设备吗?
你用我给你的那个里成把两个guid都试试! |
|
7楼#
发布于:2003-07-30 12:25
附件2,我觉得应该是附件2对应的GUID
[编辑 - 7/30/03 by duanjong] |
|
8楼#
发布于:2003-07-30 12:24
通过DEFINE_GUID定义的PGUID 是注册表中的symbolicname对应的PGUID还是classguid,应该是附件中的哪一个?
|
|
9楼#
发布于:2003-07-30 10:59
如下图右边框里的driver下里面的guid,你可以试试,如果不行的话我就没办法了:
|
|
10楼#
发布于:2003-07-30 10:46
下面我给你个完整的例程,我的设备就是用这个函数打开的,但是前提是你必须知道驱动里用来生成symbollinkname的guid,我的因为有驱动程序的源代码,因此我把里面的直接拷贝出来就可以了:
HANDLE open_dev() { PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL; SP_INTERFACE_DEVICE_DATA deviceInfoData; ULONG predictedLength = 0; ULONG requiredLength = 0; HANDLE hOut = INVALID_HANDLE_VALUE; HDEVINFO hardwareDeviceInfo = NULL; PUSB_DEVICE_DESCRIPTOR UsbDevices; deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA); UsbDevices = (PUSB_DEVICE_DESCRIPTOR)malloc (sizeof (USB_DEVICE_DESCRIPTOR)); if (NULL == UsbDevices) { SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); return hOut; } hardwareDeviceInfo = SetupDiGetClassDevs( (LPGUID)&GUID_CLASS_D12_BULK, NULL, // Define no enumerator (global) NULL, // Define no (DIGCF_PRESENT | // Only Devices present DIGCF_INTERFACEDEVICE)); if(hardwareDeviceInfo == NULL) { SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); if(UsbDevices) free(UsbDevices); } SetupDiEnumDeviceInterfaces (hardwareDeviceInfo, 0, // We don\'t care about specific PDOs (LPGUID) &GUID_CLASS_D12_BULK, 0, &deviceInfoData); SetupDiGetDeviceInterfaceDetail( hardwareDeviceInfo, &deviceInfoData, NULL, // probing so no output buffer yet 0, // probing so output buffer length of zero &requiredLength, NULL); // not interested in the specific dev-node predictedLength = requiredLength; if(predictedLength) { functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc (predictedLength); functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA); } // // Retrieve the information from Plug and Play. // if (!SetupDiGetDeviceInterfaceDetail ( hardwareDeviceInfo, &deviceInfoData, functionClassDeviceData, predictedLength, &requiredLength, NULL)) { SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); if(functionClassDeviceData) free(functionClassDeviceData); if(UsbDevices) free(UsbDevices); return hOut; } hOut = CreateFile ( functionClassDeviceData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, // no SECURITY_ATTRIBUTES structure OPEN_EXISTING, // No special create flags 0, // No special attributes NULL); // No template file SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); free(functionClassDeviceData); if(UsbDevices) free(UsbDevices); return hOut; } 里面的guid:DEFINE_GUID(GUID_CLASS_D12_BULK, 0x36FC9E60, 0xC465, 0x11CF, 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00); 这个guid可以通过vc里有一个guid产生工具产生一个,可是如过你没有源代码的话我就不知道如何获得设备guid了,好像他们一般是从注册表中得到的!。 |
|
11楼#
发布于:2003-07-29 22:30
那INF文件中的classguid 是你指的设备的guid吗?在注册表中的哪个位置?是symbolicname 吗?是附件中的那一个?
|
|
12楼#
发布于:2003-07-29 22:12
不是classGUID,应该是你设备的guid。
没有usb设备你怎么调app呀? 所有的usb传输都是要由硬件参与的,没有硬件还有什么玩的? |
|