реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по CY7C68013A, точнее по его связи с ПК
PriBoris
сообщение May 19 2011, 14:43
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 7-10-05
Из: Санкт-Петербург
Пользователь №: 9 352



Не удаётся запустить асинхронный приём (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);
Go to the top of the page
 
+Quote Post
Konst_777
сообщение May 20 2011, 06:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(PriBoris @ May 19 2011, 17:43) *
Не удаётся запустить асинхронный приём (IN)...

А, не хотите взять из этой темы работающий пример (Archive.rar) и сравнить исходники?
Go to the top of the page
 
+Quote Post
PriBoris
сообщение May 20 2011, 07:41
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 7-10-05
Из: Санкт-Петербург
Пользователь №: 9 352



Цитата
А, не хотите взять ... и сравнить исходники?

Да, спасибо, помогло,
я не делал сброс ожидающего эндпоинта (IOCTL_ADAPT_ABORT_PIPE)
Go to the top of the page
 
+Quote Post
PriBoris
сообщение May 26 2011, 17:04
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 7-10-05
Из: Санкт-Петербург
Пользователь №: 9 352



Дополнительный вопрос:

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

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

Может есть какие-то секретные методы ?
Go to the top of the page
 
+Quote Post
Konst_777
сообщение May 29 2011, 18:29
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



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

WM_DEVICECHANGE, RegisterDeviceNotification, и опрос в реестре времени последнего подключения/отключения устройства USB. Или этих средств не достаточно?
Go to the top of the page
 
+Quote Post
PriBoris
сообщение Jun 8 2011, 18:35
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 7-10-05
Из: Санкт-Петербург
Пользователь №: 9 352



Цитата(Konst_777)
WM_DEVICECHANGE...
Спасибо, это то что нужно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 01:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01308 секунд с 7
ELECTRONIX ©2004-2016