保存
最近搞一个usb设备,直接使用Cypress的那个usb驱动示例ezusbsys.sys作为驱动,读写数据都可以,但如果usb设备没有数据,则DeviceIoControl函数无法返回,即便关闭程序也没有用,除非拔了设备,或让usb设备发送数据――请大家帮忙:怎样能够使得读不到数据也能让DeviceIoControl返回。
打开设备如下所示:
char szDeviceName[256] = ".Ezusb-0";
m_hIDComDev = CreateFile(szDeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
下面开始读数据:
BYTE pBuffer[1024];
DWORD nBufferSize = 4;
BULK_TRANSFER_CONTROL btc;
btc.pipeNum = 1;
if (!DeviceIoControl(m_hIDComDev, IOCTL_EZUSB_BULK_READ, &btc,sizeof (BULK_TRANSFER_CONTROL),pBuffer, nBufferSize,&nBufferSize,&m_OverlappedRead))
//这里,如果usb没有数据则函数无法返回
{
if( GetLastError() == ERROR_IO_PENDING )
{
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
return( (int) dwBytesRead );
}
return( 0 );
}
while(WaitForSingleObject(m_OverlappedRead.hEvent,100)==WAIT_TIMEOUT)
{
if(!m_bOpened)
{
//Cancel the pending read
CancelIo(m_hIDComDev);
return 0;
}
}
if(!GetOverlappedResult(m_hIDComDev, &m_OverlappedRead, &dwBytesRead, FALSE))
{
return 0;
}
[编辑 - 7/20/04 by quakeforever]