mfzg
驱动牛犊
驱动牛犊
  • 注册日期2007-05-29
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
阅读:2028回复:4

求救!关于USB读/写设备的超时问题?

楼主#
更多 发布于:2007-07-03 11:20
本人在做一个动态库,用于对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;
}
驱网无线,快乐无限
mfzg
驱动牛犊
驱动牛犊
  • 注册日期2007-05-29
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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 设备写入数据
*******************************************************/
驱网无线,快乐无限
mfzg
驱动牛犊
驱动牛犊
  • 注册日期2007-05-29
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-03 17:04
等待高手中.........................................急
驱网无线,快乐无限
mfzg
驱动牛犊
驱动牛犊
  • 注册日期2007-05-29
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-04 08:13
过了一晚,还是没有那位大虾知道,急!自己先顶一下!
驱网无线,快乐无限
mfzg
驱动牛犊
驱动牛犊
  • 注册日期2007-05-29
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-04 10:31
刚才搜索了一下旧帖,遇到我这个问题的人还真不少,可是就没有一个满意的答案,郁闷呀!看来这问题在这里是不会有什么结果了!
驱网无线,快乐无限
游客

返回顶部