阅读:2029回复:4
求救!关于USB读/写设备的超时问题?
本人在做一个动态库,用于对USB数据的读/写,做好后调试发现一些问题,特向高人请教,就是在USB设备有数据发送到PC的时候,应用程序能接收到设备发过来的数据,当USB设备没有数据发送时,PC就会死机,我查了一下相关的文章,说这是由于ReadFile函数在没有数据时的无限等待造成的,可我不知道该怎样解决这个超时的问题,希望高手指点.还有就是我是第一次写动态库,C++也没有好好学过,我以前只学过C,所有的东西都是一边上网查资料一边写程序,我不太了解进程和线程的关系,我的理解是进程就是这个应用程序的实例,线程我就不知道了,因此我把原码帖出来,大家看看哪里不对.
#include "stdafx.h" #include <winioctl.h> #include "LEDcontrollerdll.h" #include "..\LEDcontrollerioctl.h" #include "..\LEDcontrollerDeviceinterface.h"// Has class GUID definition //////////////////////////////////////////////////////////////////////// HANDLE g_hDevice = INVALID_HANDLE_VALUE; GUID ClassGuid = LEDcontrollerDevice_CLASS_GUID; ////////////////////////函数声明////////////////////////////////////// HANDLE OpenByInterface(GUID* pClassGuid, DWORD instance, PDWORD pError); DWORD Error; ////////////////////////DLL入口函数//////////////////////////////////// BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: //进程被调用 g_hDevice = OpenByInterface( &ClassGuid, 0, &Error); if (g_hDevice == INVALID_HANDLE_VALUE) { return FALSE; } break; case DLL_THREAD_ATTACH: //线程被调用 break; case DLL_THREAD_DETACH: //线程被停止 break; case DLL_PROCESS_DETACH: //进程被停止 if (g_hDevice != INVALID_HANDLE_VALUE) { CloseHandle(g_hDevice); g_hDevice = INVALID_HANDLE_VALUE; } break; } return TRUE; } ///////////////////////////////输出函数//////////////////////////////////// EXPORT int __stdcall ReadData(int Endpointnum,unsigned char *recbuffer,int len,int waittime) { ULONG nRead,nInput; switch (Endpointnum) { case 1: // SetTimer(hMODULE,1,1000,NULL);//设置定时器1 DeviceIoControl(g_hDevice, //设备句柄 LEDCONTROLLER_IOCTL_Read, // 控制码 NULL, // 输入数据缓冲区指针 0, // 输入数据缓冲区长度 recbuffer, // 输出数据缓冲区指针 len, // 输出数据缓冲区长度 &nInput, // 读入数据实际长度单元长度 NULL); // 重叠操作结构指针 return nInput; break; case 2: ReadFile(g_hDevice, recbuffer, len, &nRead, NULL); return nRead; break; default: return -1; } return -1; } EXPORT int __stdcall WriteData(int Endpointnum,unsigned char *sendbuffer,int len,int waittime) { ULONG nWritten,nOutput; switch (Endpointnum) { case 1: DeviceIoControl(g_hDevice, //设备句柄 LEDCONTROLLER_IOCTL_Write, // 控制码 sendbuffer, // 输入数据缓冲区指针 16, // 输入数据缓冲区长度 NULL, // 输出数据缓冲区指针 0, // 输出数据缓冲区长度 &nOutput, // 输出数据实际长度单元长度 NULL); // 重叠操作结构指针 return nOutput; break; case 2: WriteFile(g_hDevice, sendbuffer, len, &nWritten, NULL); return nWritten; break; default: return -1; } return -1; } |
|
|
沙发#
发布于:2007-07-03 11:27
*****函数说明*******超时的问题还没解决***********************
1.1 int __stdcall ReadData(int Endpointnum,unsigned char *recbuffer,int len,int waittime); /******************************************************* 入口参数: Endpointnum: 所要操作的端点号,可以为1,2 recbuffer:接收数据缓冲区 len:接收数据缓冲区长度,必须为实际所要接收的数据长度,最大长度为64 个字节 waittime:等待超时时间,为-1 表示一直等待 返回值:读取成功为读取到的字节数,否则为-1 函数功能:从USB 设备读取数据 *******************************************************/ 1.2 int __stdcall WriteData(int Endpointnum,unsigned char *sendbuffer,int len,int waittime); /******************************************************* 入口参数: Endpointnum: 所要操作的端点号,可以为1,2 secbuffer:发送数据缓冲区 len:发送数据缓冲区长度,必须为实际所要发送的数据长度,最大长度为64个字节 waittime:等待超时时间,为-1 表示一直等待 返回值:写入成功为发送的字节数,否则为-1 函数功能:向USB 设备写入数据 *******************************************************/ |
|
|
板凳#
发布于:2007-07-03 17:04
等待高手中.........................................急
|
|
|
地板#
发布于:2007-07-04 08:13
过了一晚,还是没有那位大虾知道,急!自己先顶一下!
|
|
|
地下室#
发布于:2007-07-04 10:31
刚才搜索了一下旧帖,遇到我这个问题的人还真不少,可是就没有一个满意的答案,郁闷呀!看来这问题在这里是不会有什么结果了!
|
|
|