crossplatform.ru

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


  Ответ в libusb_device_handle to HANDLE
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
laa88rf Дата 27.8.2013, 11:43
  Разобрался. Благодарю за помощь.
laa88rf Дата 27.8.2013, 11:12
  Он равен на одной машине 6, а на другой 8. Т.е. по количеству usb-девайсов. Если usb нет совсем, то, я так думаю, он тогда должен вернуть -1.
Iron Bug Дата 27.8.2013, 9:49
  NumDev чему равен при вызове? он изменяется от 0 до значения, возвращаемого CP210x_GetNumDevices - 1.
внимательно читаем документацию.
laa88rf Дата 27.8.2013, 9:33
  Точно. Пропустил это. Однако тоже странно, что оно по-прежнему "валится", и в том же месте.

...
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, 7:58
  читай документацию.
Цитата
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
Andriuxa Дата 26.8.2013, 14:56
  Благодарю за объяснение.
Вот только библиотека кривая какая-то.
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 Дата 24.8.2013, 22:02
  я так понимаю, что они поставляют уже готовую библиотеку для работы с их драйвером. зачем сюда лепить ещё usblib?
вот что разработчики пишут в документации к CP210x: http://www.silabs.com/Support%20Documents/...lDocs/an197.pdf

а из приведённого тобой куска документации понятно, что надо сначала вызывать CP210x_GetNumDevices(), чтобы получить список доступных устройств данного типа. а потом выбрать нужное (по каким-то юзерким критериям, обычно там серийный номер или что-то типа того).
обычный подход к написанию библиотек для таких девайсов:
1. считывается список доступных устройств.
2. выбирается одно из них (если их много) по какому-то признаку - это уже зависит от юзера.
3. открывается некий библитотечный дескриптор устройства через библиотечную функцию и дальше идёт работа с этим дескриптором.
4. открытый дескриптор закрывается.
Andriuxa Дата 23.8.2013, 17:13
  есть устройство 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 Дата 23.8.2013, 14:41
  никак. разработчики декларируют libusb_device_handle как непрозрачную для юзера структуру. если разработчики решили не давать ссылок на структуру объекта, значит, это не предусмотрено. теоретически, можно выкопать определение из сорцов, но это неправильный подход, чреватый ошибками работы с железом.
а зачем понадобился HANDLE?
Andriuxa Дата 23.8.2013, 12:58
  доп к п.1

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


cpHANDLE = dev_handle как сделать? :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 17.5.2024, 12:03