crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> libusb_device_handle to HANDLE
Гость_Andiuxa_*
сообщение 23.8.2013, 12:47
Сообщение #1





Гости








    


Привет всем. Собственно сабж. Насколько реально такое преобразование.
Поясню.

Libusb.h:
...
struct libusb_device_handle;
...
typedef struct libusb_device_handle libusb_device_handle;
...


Описания структуры в этом файле нет.

Далее Types.h:
...
typedef void *HANDLE;
typedef HANDLE *LPHANDLE;
...



Как быть или я идиот? :p
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Andriuxa_*
сообщение 23.8.2013, 12:58
Сообщение #2





Гости








    


доп к п.1

код:
libusb_device_handle *dev_handle;
HANDLE *cpHANDLE;


cpHANDLE = dev_handle как сделать? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 23.8.2013, 14:41
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


никак. разработчики декларируют libusb_device_handle как непрозрачную для юзера структуру. если разработчики решили не давать ссылок на структуру объекта, значит, это не предусмотрено. теоретически, можно выкопать определение из сорцов, но это неправильный подход, чреватый ошибками работы с железом.
а зачем понадобился HANDLE?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Andriuxa_*
сообщение 23.8.2013, 17:13
Сообщение #4





Гости








    


есть устройство cp210x, для него надо написать прогу. Так вот там функция cp210x_open(). Вот так выглядит:
CP210x_Open
Description: Opens and returns a handle to a device using a device number determined by the number
returned from CP210x_GetNumDevices().
Supported Devices: CP2101, CP2102, CP2103, CP2104, CP2105
Location: CP210x Manufacturing DLL
Prototype: CP210x_STATUS CP210x_Open( DWORD DeviceNum, HANDLE* Handle )
Parameters: 1. DeviceNum—Device index. 0 for the first device, 1 for the second, etc.
2. Handle—Pointer to a variable where the handle to the device will be stored. This handle will be
used for all subsequent accesses to the device.
Return Value: CP210x_STATUS = CP210x_SUCCESS,
CP210x_DEVICE_NOT_FOUND,
CP210x_INVALID_PARAMETER


передаю ей через (void **), пока, этот параметр, но мне заявляет, что у меня руки кривые и так она это устройство не найдет. libusb.h находит девайс сразу по vid/pid, а вот как cp210x заставить вкалывать, я понять не могу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 24.8.2013, 22:02
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


я так понимаю, что они поставляют уже готовую библиотеку для работы с их драйвером. зачем сюда лепить ещё usblib?
вот что разработчики пишут в документации к CP210x: http://www.silabs.com/Support%20Documents/...lDocs/an197.pdf

а из приведённого тобой куска документации понятно, что надо сначала вызывать CP210x_GetNumDevices(), чтобы получить список доступных устройств данного типа. а потом выбрать нужное (по каким-то юзерким критериям, обычно там серийный номер или что-то типа того).
обычный подход к написанию библиотек для таких девайсов:
1. считывается список доступных устройств.
2. выбирается одно из них (если их много) по какому-то признаку - это уже зависит от юзера.
3. открывается некий библитотечный дескриптор устройства через библиотечную функцию и дальше идёт работа с этим дескриптором.
4. открытый дескриптор закрывается.

Сообщение отредактировал Iron Bug - 24.8.2013, 22:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Andriuxa_*
сообщение 26.8.2013, 14:56
Сообщение #6





Гости








    


Благодарю за объяснение.
Вот только библиотека кривая какая-то.
CP210x_GetNumDevices() - возвращает количество устройств
...
DWORD NumDev;
...
cpstatus = CP210x_GetNumDevices(&NumDev);
qDebug() << cpstatus << " " << NumDev;


Prototype: CP210x_STATUS CP210x_GetNumDevices( LPDWORD NumDevices )


Однако теперь другая проблема. Судя, по ману, после GetNumDevices, я должен вызвать CP210x_GetProductString. Но при вызове у меня все дохнет (core dumped). В чем дело, я понять не могу.

...
DWORD GetNumDev;
LPVOID DevStr;
DWORD options;
...
cpstatus = CP210x_GetProductString(GetNumDev, &DevStr, options);


Prototype: CP210x_STATUS CP210x_GetProductString( DWORD DeviceNum, LPVOID DeviceString, DWORD Options )


Для чего вообще создавать указательного типа на void, я понять не могу.

CP210x_STATUS CP210x_GetProductString(
        DWORD dwDeviceNum,
        LPVOID lpvDeviceString,
        DWORD dwFlags
        ) {
    //TODO - fill out all flagged strings
    HANDLE h;
    if (CP210x_Open(dwDeviceNum, &h) == CP210x_SUCCESS) {
        BYTE length;
        return CP210x_GetDeviceSerialNumber(h, lpvDeviceString, &length, true);
    }
    
    return CP210x_DEVICE_NOT_FOUND;
}


Судя по отладчику, валится на if (CP210x_Open(dwDeviceNum, &h) == CP210x_SUCCESS).
Я понимаю, что по логике, оно должно вернуть CP210x_DEVICE_NOT_FOUND, но этого не происходит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.8.2013, 7:58
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


читай документацию.
Цитата
CP210x_GetProductString
Description:
This function returns a null terminated serial number (S/N) string, product description string or full path string for the device specified by an index passed in the DeviceNum parameter. The index of the first device is 0 and the index of the last device is the value (NumDevices) returned by CP210x_GetNumDevices() - 1.
Supported Devices:
CP2101, CP2102, CP2103
Location:
CP210x Manufacturing DLL
Prototype:
CP210x_STATUS CP210x_GetProductString( DWORD DeviceNum, LPVOID DeviceString, DWORD Options )
Parameters:
1. DeviceNum—Index of the device for which the product description string, serial number or full path is desired.
2. DeviceString—Variable of type CP210x_DEVICE_STRING returning the NULL terminated serial number, device description or full path string.
3. Options—Flag that determines if DeviceString contains the product description, serial number or full path string.
Return Value:
CP210x_STATUS = CP210x_SUCCESS,CP210x_DEVICE_NOT_FOUND,CP210x_INVALID_PARAMETER
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
laa88rf
  опции профиля:
сообщение 27.8.2013, 9:33
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 30.7.2010
Из: Orsk
Пользователь №: 1918

Спасибо сказали: 0 раз(а)




Репутация:   0  


Точно. Пропустил это. Однако тоже странно, что оно по-прежнему "валится", и в том же месте.

...
CP210x_DEVICE_STRING  DevStr;
...
void MainWindow::getprodstrcp210x() {
    cpstatus = CP210x_GetProductString(NumDev, &DevStr, options);
    qDebug() << cpstatus << " " << DevStr;
}


Еще один интересный факт. Если выполнить эту функцию без получения NumDevice, то я получаю сообщение с кодом 255 (что устройство не найдено) и руганью X����gj��=ĶX�^ 5 q�. Декодировать не стал. А вот как только я получаю NumDev:
void MainWindow::getnumdevcp210x() {
    cpstatus = CP210x_GetNumDevices(&NumDev);
    qDebug() << cpstatus << " " << NumDev;
}

То все валится. Может у меня проблема с понимаем работы с указателями, а может библиотека кривая или программного обеспечения не хватает? Или все сразу? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.8.2013, 9:49
Сообщение #9


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


NumDev чему равен при вызове? он изменяется от 0 до значения, возвращаемого CP210x_GetNumDevices - 1.
внимательно читаем документацию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
laa88rf
  опции профиля:
сообщение 27.8.2013, 11:12
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 30.7.2010
Из: Orsk
Пользователь №: 1918

Спасибо сказали: 0 раз(а)




Репутация:   0  


Он равен на одной машине 6, а на другой 8. Т.е. по количеству usb-девайсов. Если usb нет совсем, то, я так думаю, он тогда должен вернуть -1.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 2.5.2024, 17:50