Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по CY7C68013A
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
PriBoris
Не удаётся запустить асинхронный приём (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);
Konst_777
Цитата(PriBoris @ May 19 2011, 17:43) *
Не удаётся запустить асинхронный приём (IN)...

А, не хотите взять из этой темы работающий пример (Archive.rar) и сравнить исходники?
PriBoris
Цитата
А, не хотите взять ... и сравнить исходники?

Да, спасибо, помогло,
я не делал сброс ожидающего эндпоинта (IOCTL_ADAPT_ABORT_PIPE)
PriBoris
Дополнительный вопрос:

Есть ли метод, позволяющий среагировать на отсоединение USB-кабеля ?

Вижу, что в этот момент DeviceIoControl(IOCTL_ADAPT_SEND_NON_EP0_DIRECT)/GetOverlappedResult возвращают наличие буфера максимальной длины (2048), что бывает и в штатном режиме. Других отличительных признаков не нашел.
DeviceIoControl(IOCTL_ADAPT_GET_ADDRESS) тоже говорит, что всё в порядке.

Может есть какие-то секретные методы ?
Konst_777
Цитата(PriBoris @ May 26 2011, 20:04) *
...Есть ли метод, позволяющий среагировать на отсоединение USB-кабеля ?...

WM_DEVICECHANGE, RegisterDeviceNotification, и опрос в реестре времени последнего подключения/отключения устройства USB. Или этих средств не достаточно?
PriBoris
Цитата(Konst_777)
WM_DEVICECHANGE...
Спасибо, это то что нужно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.