Russian Qt Forum
Ноябрь 25, 2024, 04:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование USB HID  (Прочитано 8203 раз)
useruser
Гость
« : Ноябрь 09, 2013, 15:02 »

(Перенёс эту тему из Вопросов новичков т.к. судя по поиску такие вопросы обсуждаются здесь. Там всё удалил.)

Нашел интересную статью об использовании USB Hid.
http://embeddedsoft.ru/index.php?page=23

Код, main.cpp ниже (если нужно)
Пример рабочий. Но это консольное приложение, а я хочу создать с формой -WYSIWYG. Модифицировать, потестить и т.д. Посмотреть одним словом.
Переписать код, я думаю, будет не сложно. Половина кода -это отображение и взаимодействие с консолью.
Подскажите, существует ли документация на русском языке с описанием всех функций, методов и т.д. этой библиотеки?
Я догадываюсь, что hid->read(); -это чтение данных с устройства. Но перед этим идёт заполнение массива данными и прочие действия.
Не хочется действовать методом научного тыка.
Или есть другие, более универсальные и простые решения - библиотеки, с хорошей документацией?    
http://microsin.ru/content/view/1317/44/
Из этого списка подходит libusb, но для неё нужно писать драйвер для устройства. А это сложно, для новичка.

Так-же нужна литература по работе с USB HID под Linux.
Программу пишу для windows и linux.

С этим вопросом мучаюсь уже месяц. Литературы в инете 0. Есть примеры только для Windows "Агуров П. Интерфейс USB. Практика использования и программирования".

С QT тоже проблемы - то не хватает библиотек, то не найдена точка входа в процедуру.
Трачу много времени на заморочки самого qt.

Уже начинаю думать - а может ну его qt?)) Есть pure basic - библиотек не требует, кросплатформенный и куча литературы на русском про USB HID.

Рабочий код QT

Код:
//  #define VID 0xC251
//  #define PID 0x1701

#define REPORT_LENGTH   256

#include <stdlib.h>
#include <unistd.h>

#include <QDir>
#include <QLibrary>

#include "hidapi.h"


typedef struct hid_device_info* (*HID_ENUMERATE)(unsigned short, unsigned short);
typedef void (*HID_FREE_ENUMARATION)(struct hid_device_info*);
typedef hid_device* (*HID_OPEN)(unsigned short, unsigned short, wchar_t*);
typedef int (*HID_GET_MANUFACTURER_STRING)(hid_device *, wchar_t *, size_t);
typedef int (*HID_GET_PRODUCT_STRING)(hid_device*, wchar_t*, size_t);
typedef int (*HID_GET_SERIAL_NUMBER_STRING)(hid_device*, wchar_t*, size_t);
typedef int (*HID_SET_NONBLOCKING)(hid_device*, int);
typedef int (*HID_SEND_FEATURE_REPORT)(hid_device*, const unsigned char*, size_t);
typedef int (*HID_GET_FEATURE_REPORT)(hid_device*, unsigned char*, size_t);



class hidControl
{
private:
    HID_OPEN hid_open;
    HID_SET_NONBLOCKING hid_set_nonblocking;
    HID_SEND_FEATURE_REPORT hid_send_feature_report;
    HID_GET_FEATURE_REPORT hid_get_feature_report;

public:
    hidControl()
    {}

    ~hidControl()
    {}

    unsigned char buf[REPORT_LENGTH];
    bool deviceFound;
    hid_device *handle;

    // Инициализация HID
    int init(unsigned int VID, unsigned int PID)
    {
        // Пробуем подключить библиотеку
        QDir curdir;
        QLibrary lib(curdir.absolutePath() + "/hidapi");

        lib.load();

        if (!lib.isLoaded())
            return -1;

        hid_open = (HID_OPEN)lib.resolve("hid_open");
        hid_set_nonblocking = (HID_SET_NONBLOCKING)lib.resolve("hid_set_nonblocking");
        hid_send_feature_report = (HID_SEND_FEATURE_REPORT)lib.resolve("hid_send_feature_report");
        hid_get_feature_report = (HID_GET_FEATURE_REPORT)lib.resolve("hid_get_feature_report");

        deviceFound = false;

        handle = hid_open(VID, PID, NULL);

        if (handle)
        {
            deviceFound = true;
            hid_set_nonblocking(handle, 1);
        }
        else
            return -1;

        return 0;
    }

    int write()
    {
        buf[0] = 0x00;  // Идентификатор посылки всегда 0х00

        return hid_send_feature_report(handle, buf, REPORT_LENGTH);
    }

    int read()
    {
        buf[0] = 0x00;  // Идентификатор посылки всегда 0х00

        hid_send_feature_report(handle, buf, REPORT_LENGTH);

        usleep(10000);

        return hid_get_feature_report(handle, buf, REPORT_LENGTH);
    }

};


int main(int argc, char *argv[])
{
    hidControl *hid;

    hid = new hidControl();



    if (argc < 5)
    {
        printf("usage:\nusb.exe [VID] [PID] -r [CMD]\n");
        printf("or\nusb.exe [VID] [PID] -w [CMD]\n");
        printf("VID and PID must be in dec format, not hex\n");

        return -1;
    }





    if (hid->init(atoi(argv[1]), atoi(argv[2])) < 0)
        return -2;

    if (!strcmp(argv[4], "-r"))
    {
            int cmd = atoi(argv[4]);

            hid->buf[1] = cmd;
            hid->read();

            printf("readed data, cmd %d\n", argv[4]);
            printf("%s\n", hid->buf);

            return 1;
    }

    if (!strcmp(argv[4], "-w"))
    {
            strcpy((char*)hid->buf, (char*)argv[4]);
            hid->write();

            printf("writted data, cmd %s\n", argv[4]);
            return 2;
    }

    return 0;



}










« Последнее редактирование: Ноябрь 09, 2013, 15:13 от useruser » Записан
Hrundel
Гость
« Ответ #1 : Ноябрь 10, 2013, 13:23 »

Кстати, интересно, эта библиотека будет поддерживать gamepad или джойстик?
Записан
Bepec
Гость
« Ответ #2 : Ноябрь 10, 2013, 13:47 »

Насколько я помню эта библиотека просто даёт доступ к HID интерфейсу устройства. А дальше всё на ваше усмотрение Улыбающийся
Записан
useruser
Гость
« Ответ #3 : Ноябрь 11, 2013, 11:24 »

Да. Проверил на джостике.
Жаль, что ответов на свои вопросы не получил. Копаю в сторону purebasic.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 20.