Russian Qt Forum

Qt => Вопросы новичков => Тема начата: KPN от Октябрь 07, 2016, 10:09



Название: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 10:09
Доброго времени суток!!! делаю тестовый проект с использованием USB HID, в качестве устройства использую F3Discovery, сделал прошивку для управления светодиодами, из тестовой программки HID API TestGui (брал с github https://github.com/signal11/hidapi) светодиодами могу управлять. Сейчас пишу свою, использую Qt (проект во вложении).
Проблема следующая: не могу открыть устройство.
В качестве операционки использую Linux Mint 18.
Не могу понять почему не открывается устройство, в тестовой программе все работает, в чём затык?


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 07, 2016, 10:28
А где вы hid_init() вызываете?


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 10:35
я делал опираясь на исходник тестовой утилиты, там её нет.
Хорошо, как её правильно вызывать, я сделал вызов hid_init() по нажатию на кнопку "Re-Scan Devices".
не помогло.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 07, 2016, 10:40
я делал опираясь на исходник тестовой утилиты, там её нет.
Хорошо, как её правильно вызывать, я сделал вызов hid_init() по нажатию на кнопку "Re-Scan Devices".
не помогло.
Я смотрю на тестовый пример в описании библиотеки.
Я правильно понимаю, что на том же компьютере собранная вами TestGui открывает Дискавери, а ваша программа собранная с той-же библиотекой - нет?
Обе программы запускаете от root или от своего пользователя?


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 10:47
все собрано на одном и том же компьютере, обе запускаю от обычного пользователя.
сделал правила для udev:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5750", MODE="0666"

из тестовой передаются и принимаются данные.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 10:50
нашел, hid_init() вызывается в функции hid_open_path, которая в hid.c
Но проблемы это не решило...


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 07, 2016, 11:08
нашел, hid_init() вызывается в функции hid_open_path, которая в hid.c
Но проблемы это не решило...
Посмотрите в отладчике, чему равно cur_dev перед открытием. :)


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 11:14
вот, это?
с отладчиком не работал пока, правильно сделал?


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 07, 2016, 11:20
А после отработки цикла там будет 0. :)


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 11:29
что-то не совсем понимаю почему так...


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 11:32
а вот тут уже 0


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 07, 2016, 11:44
А что у вас в цикле while происходит вы понимаете? ;)


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 12:05
перечесление списка подключенных устройств, и вывод их VID,PID,SerialNumber.
cur_dev это я так понимаю какое-то текущее устройство.
next - указатель на следующее устройство.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 07, 2016, 12:11
перечесление списка подключеных устройств, и вывод их VID,PID,SerialNumber.
cur_dev это я так понимаю какое-то текущее устройство.
И оно меняется в цикле до тех пор, пока не стенет равно 0 - тогда мы выходим из цикла. Дальше идет проверка этой переменной перед открытием, а она по любому уже 0.
До вызова hid_open_path дело даже не доходит.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 12:19
хорошо, а как тогда сделать чтобы в hid_open_path передавать не нулевое значение cur_dev?

в тестовой программе сделано так:
Код:
1	struct hid_device_info *device_info = (struct hid_device_info*) item->getData();
2 if (!device_info)
3 return -1;
4
5 connected_device =  hid_open_path(device_info->path);

мне не понятна 1-я строка.
в магии с указателями не очень пока силен, на простых примерах понятно, а тут как-то не очень :(


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 07, 2016, 12:26
У вас devs указывает на первое устройство или содержит 0.
Используйте его:
Код
C++ (Qt)
void MainWindow::ReScanDevices(){
 
   struct hid_device_info *devs, *cur_dev;
 
   devs = hid_enumerate(0x483, 0x5750);
   cur_dev = devs;
   while (cur_dev) {
       qDebug("Device Found\n  type: %04hx %04hx\n  path: %s\n  serial_number: %ls", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number);
       qDebug("  Manufacturer: %ls\n", cur_dev->manufacturer_string);
       qDebug("  Product:      %ls\n", cur_dev->product_string);
       qDebug("  Release:      %hx\n", cur_dev->release_number);
       qDebug("  Interface:    %d\n",  cur_dev->interface_number);
       cur_dev = cur_dev->next;
   }
 
   if (devs && (connected_device = hid_open_path(devs->path))) {
       qDebug("open device");
   }
   else{
       qDebug("error open");
   }
 
   hid_free_enumeration(devs);
 
}
 

Или выбирайте нужно устройство, если их несколько.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 12:33
сделал вот так:
Код:
void MainWindow::ReScanDevices(){


    struct hid_device_info *devs, *cur_dev;

    devs = hid_enumerate(0x483, 0x5750);
    cur_dev = devs;
    while (cur_dev) {
        qDebug("Device Found\n  type: %04hx %04hx\n  path: %s\n  serial_number: %ls", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number);
        qDebug("  Manufacturer: %ls\n", cur_dev->manufacturer_string);
        qDebug("  Product:      %ls\n", cur_dev->product_string);
        qDebug("  Release:      %hx\n", cur_dev->release_number);
        qDebug("  Interface:    %d\n",  cur_dev->interface_number);
        cur_dev = cur_dev->next;
    }

    connected_device = hid_open_path(devs->path);

    if (connected_device) {
        qDebug("open device");
    }
    else{
        qDebug("error open");
    }

    hid_free_enumeration(devs);

}

всё равно qDebug выводит "error open" :(


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 07, 2016, 13:05
Проверьте устройство /dev/hidraw2 присутствует?

Попробуйте открыть по константному пути:
Код
C
connected_device = hid_open_path( "/dev/hidraw2" );
 


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 13:13
так я пробовал с самого начала, результат отрицательный :(
в папке /dev при подключении платы появляется файлик hidraw2, и когда я пытался мега примитивно открыть девайс (прям по пути) так и не удалось мне этого сделать, по VID и PID тоже не получается :(
Вообще не понятный момент, ведь тестовая программа использующая эту же библиотеку открывает устройство и дает работать с ним, а вот моя нет :(


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 14:08
В чем еще может быть косяк?
вроде в теории все понятно, подключаем устройство -> открываем его -> передаем/принимаем данные -> поюзали девайс, закрыли его.
но в моей ситуации проблема уже на этапе открытия устройства.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 07, 2016, 15:29
ага, я как понял видимо у меня библиотека вообще не подключена....
у меня в папке с проектом hid.c и hidapi.h но надо видимо еще и библиотеку как-то подключить.
в папке на github /hidapi/linux лежит libhidapi-hidraw.so , как его правильно подключить в Qt?

я попробовал так сделать:
LIBS += /home/develop/PROJECTS/Qt/DESKTOP/F3Discovery_USB_HID/libhidapi-hidraw.so
не помогло :(

и почему если просто написать:
LIBS += libhidapi-hidraw.so
то говорит что файл не найден?


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Авварон от Октябрь 07, 2016, 17:46
Кажется, LIBS += -L/home/develop/PROJECTS/Qt/DESKTOP/F3Discovery_USB_HID/ -lhidapi-hidraw


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Bepec от Октябрь 07, 2016, 21:30
Код ошибки посмотрите... Если такое есть в библиотеке (должно быть) :D


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 08, 2016, 11:26
видимо всё дело в сборке...
открыл makefile.linux а там вот что:
Код:
all: testgui

CC=gcc
CXX=g++
COBJS=../libusb/hid.o
CPPOBJS=test.o
OBJS=$(COBJS) $(CPPOBJS)
CFLAGS=-I../hidapi -Wall -g -c `fox-config --cflags` `pkg-config libusb-1.0 --cflags`
LIBS=-ludev -lrt -lpthread `fox-config --libs` `pkg-config libusb-1.0 --libs`


testgui: $(OBJS)
g++ -Wall -g $^ $(LIBS) -o testgui

$(COBJS): %.o: %.c
$(CC) $(CFLAGS) $< -o $@

$(CPPOBJS): %.o: %.cpp
$(CXX) $(CFLAGS) $< -o $@

clean:
rm *.o testgui

.PHONY: clean
вопрос, как это сделать в Qt?
я так понимаю флаги компилятору задаются "Настройки -> Сборка и запуск -> Компиляторы" выбираю компилятор, там есть строка "Platform codegen flags: " как их туда правильно написать?


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Bepec от Октябрь 08, 2016, 12:09
Если бы у вас была бы НЕ ПОДКЛЮЧЕНА библиотека, приложение у вас бы не собралось. И функции не вызывались бы. Следовательно дело в чем то другом.
Посмотрите уже код ошибки, который выводит библиотека...


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 08, 2016, 12:27
как его посмотреть?


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Bepec от Октябрь 08, 2016, 12:32
Ну в Windows есть GetLastError(). Аналога в линукс не знаю.

PS вроде errno в linux.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 08, 2016, 12:51
балииин, под рутом открылось....
хорошо, а как тогда сделать чтобы доступ к устройству был под обычным пользователем?


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 08, 2016, 13:04
ls -l /dev/hidraw*


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 08, 2016, 13:06
crw------- 1 root root 248, 0 Oct  8 14:25 /dev/hidraw0
crw------- 1 root root 248, 1 Oct  8 14:25 /dev/hidraw1
crw------- 1 root root 248, 2 Oct  8 17:05 /dev/hidraw2


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 08, 2016, 13:07
crw------- 1 root root 248, 0 Oct  8 14:25 /dev/hidraw0
crw------- 1 root root 248, 1 Oct  8 14:25 /dev/hidraw1
crw------- 1 root root 248, 2 Oct  8 17:05 /dev/hidraw2

Ну и что вам не понятно? :)


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 08, 2016, 13:19
так как мне сделать чтобы я запустил свою программу от обычного пользователя и мог работать с устройством.
сейчас он доступен же только под рутом.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 08, 2016, 13:21
так как мне сделать чтобы я запустил свою программу от обычного пользователя и мог работать с устройством.
сейчас он доступен же только под рутом.
Настроить правило udev, что бы оно нормально работало.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 08, 2016, 13:25
я написал вот так, не работает.
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5750", MODE="0666"


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: Old от Октябрь 08, 2016, 13:55
я написал вот так, не работает.
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5750", MODE="0666"
Но оно не срабатывает. Разберитесь почему.


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 08, 2016, 13:55
проблему решил,
вот так:
KERNEL=="hidraw*", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5750", MODE="0666"
блин делал же так...
не работало, думаю в спешке забыл правила перезагрузить


Название: Re: Работа с устройствами USB HID с использованием HID API
Отправлено: KPN от Октябрь 10, 2016, 05:24
всем спасибо за помощь :)