Не удаётся запустить асинхронный приём (IN). Передача (OUT) с помощью DeviceIoControl(IOCTL_ADAPT_SEND_NON_EP0_DIRECT) как простая так и асинхронная идет без проблем, а с приемом беда. Когда происходит таймаут, приложение безнадежно повисает. Его не снять ни так ни ProcessExplorer-ом. Помогает только выдергивание USB из платы.
Посмотрите код, может быть я что-то некорректно делаю ?
Код
SINGLE_TRANSFER *pTransfer = new SINGLE_TRANSFER;
memset(pTransfer,0,sizeof(SINGLE_TRANSFER));
pTransfer->ucEndpointAddress = EPIN_ADDRESS;
BOOL bDeviceIoControlResult;
DWORD dwReturnBytes;
{
RxOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
bDeviceIoControlResult = DeviceIoControl (hDevice,
IOCTL_ADAPT_SEND_NON_EP0_DIRECT,
pTransfer, sizeof(SINGLE_TRANSFER),
UsbRxBuffer,512,
&dwReturnBytes,&RxOverlapped);
if (bDeviceIoControlResult==TRUE)
{
printf("INFO: (RX) dwReturnBytes = %d\n",dwReturnBytes);
CloseHandle(RxOverlapped.hEvent);
}
else
{
switch(WaitForSingleObject(RxOverlapped.hEvent,1000))
{
case WAIT_OBJECT_0:
GetOverlappedResult(hDevice,&RxOverlapped,&dwReturnBytes,TRUE);
printf("INFO: (RX) dwReturnBytes = %d\n",dwReturnBytes);
break;
case WAIT_TIMEOUT:
printf("ERROR: (RX) WaitForSingleObject timeout\n");
break;
default:
printf("ERROR: (RX) WaitForSingleObject error %d\n",GetLastError());
break;
}
CloseHandle(RxOverlapped.hEvent);
}
}
CloseHandle(hDevice);