LINUX.ORG.RU

HIDAPI Lubuntu Qt

 ,


0

1

Всем привет! Есть проект, нужно из под Линукс соединиться с контроллером, контроллер изначально настроен как hid-устройство. Для этих целей я взял библиотеку hidapi отсюда https://github.com/signal11/hidapi по инструкции собрал, подключил либы в Qt, все компилится, вначале проги получаю список всех хид-устройств с пидами и вендорами, но я ничего не могу отправить, код ниже:

#include <QCoreApplication>

#include <hidapi/hidapi.h>
#include <QDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int res;
    unsigned char buf[65];
    wchar_t wstr[MAX_STR];

    hid_device *handle;

    // Enumerate and print the HID devices on the system
    struct hid_device_info *devs, *cur_dev;

   
    devs = hid_enumerate(0x0, 0x0);
    cur_dev = devs;

    while (cur_dev) {
        qDebug() << "vendor_id: " << cur_dev->vendor_id;
        qDebug() << "product_id: " << cur_dev->product_id;
        qDebug() << "path: " << QString(cur_dev->path);
        qDebug() << "serial_number: " << cur_dev->serial_number;
        qDebug() << "manufacturer_string: " 
                 << cur_dev->manufacturer_string;
        qDebug() << "product_string: " 
                 << cur_dev->product_string << "\n";

        cur_dev = cur_dev->next;
    }
    hid_free_enumeration(devs);

    
    unsigned char buf[2];
    hid_device *handle;
    
    handle = hid_open(0x4C53, 0x0007, NULL);
    qDebug() << "handle is: " << handle;

    buf[0] = 0x01;
    buf[1] = 0x01;

    res = hid_send_feature_report(handle, buf, 2);
    qDebug() << "hid_send_feature_report :" << res;

    res = hid_exit();
    qDebug() << "hid_exit :" << res;

    return a.exec();
}

начиная со строчки handle = hid_open(0x4C53, 0x0007, NULL); хендл становится нулем - и все, я пробовал пересобирать библиотеку, ставить более раннюю версию - ничего не помогает, хендл становится нулем. Что я делаю не так, подскажите, пожалуйста


На гитхабе по ссылке я вижу пример со строкам:

	// Initialize the hidapi library
	res = hid_init();
У тебя есть вызов этой функции?

UVV ★★★★★
()
Ответ на: комментарий от UVV

да, есть. пардон, я ее удалил, когда сюда вписывал код, а так - стоит

    int res = 0;
    unsigned char buf[2];
    hid_device *handle;

    res = hid_init();
    qDebug() << "hid_init :" << res;
    
    handle = hid_open(0x4C53, 0x0007, NULL);
    qDebug() << "handle is: " << handle;

Tumyq
() автор топика
Ответ на: комментарий от xaizek

добавил

handle = hid_open(0x4C53, 0x0007, NULL);
qDebug() << "error string: " << hid_error(handle);
qDebug() << "handle is: " << handle;

получил

hid_init : 0
error string:  0x0
handle is:  0x31a0568
hid_send_feature_report : -1
hid_exit : 0

0 - все в порядке

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

пошел дальше, прологировал этот хендл, вывод в консоли:

hid_init : 0
handle is before opening:  0x65ff80
error string:  0x0
handle is after opening:  0x2770568
hid_send_feature_report : -1
handle is aftet sending report:  0x2770568
hid_exit : 0
handle is at end of all program:  0x2770568
Tumyq
() автор топика
Ответ на: комментарий от Tumyq

С ошибкой завершается hid_send_feature_report, после него hid_error и надо вызывать. С хендлом то всё в порядке, он не NULL.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

хорошо, тогда так. но моя такие ошибки не понимать

hid_init : 0
handle is before opening:  0x3061438
handle is after opening:  0x306d160
hid_send_feature_report : -1
error string:  0x26aa1f8
handle is aftet sending report:  0x306d160
hid_exit : 0
handle is at end of all program:  0x306d160
Tumyq
() автор топика
Ответ на: комментарий от Tumyq

Оно же возвращает const wchar_t*, надо его как-то через QString преобразовать в локальную кодировку, чтобы оно вывелось текстом.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

это просто мусор , ничего там нет пробовал конвертануть и по супер-пупер схеме с преобразованиями типов std, и просто - кудебагом - одно и то же

 
hid_init : 0
handle is before opening:  0xa211438
handle is after opening:  0xa21d470
hid_send_feature_report : -1

Error: ╧рЁрьхЄЁ чрфрэ эхтхЁэю.

handle is aftet sending report:  0xa21d470
hid_exit : 0
handle is at end of all program:  0xa21d470

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

Непохоже на мусор(ктож точку в конце мусора ставит и пробелы между короткими кусками мусора?).

Попробуй так:

qDebug() << QString::fromWCharArray(hid_error(handle));

Возможно, ещё придётся поупражняться с QTextCodec.

pon4ik ★★★★★
()
Ответ на: комментарий от Tumyq

В дополнении к тому, что pon4ik написал, локаль не русская случайно стоит? Может быть проще сделать

export LC_ALL=en_US.utf8

xaizek ★★★★★
()
Ответ на: комментарий от pon4ik

это и был второй способ, которым тоже пробовал

Tumyq
() автор топика
Ответ на: комментарий от CryAngel

у меня само приложение консольное, оно консоль и открывает. мне теперь надо сборку на выпуск делать?

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

Эта штука смогла. Это WINDOWS-1251.

Параметр задан неверно.

В документации:

The first byte of data[] must contain the Report ID. For devices which only support a single report, this must be set to 0x0.
Может в этом дело.

xaizek ★★★★★
()
Ответ на: комментарий от Tumyq

так то можно же сначала открыть консоль, потом выполнить нужные команды (в т.ч. запуск программы). но, судя по «крякозябрам», у меня стойкое чувство, что дело происходит в виндах, а там указанная команда не сработает. и, хотя в комментарии выше текст уже расшифровали, возможно стоит покопать в сторону установки виндовой кодировки, что бы в дальнейшем русский текст был читабельным.

CryAngel
()
Последнее исправление: CryAngel (всего исправлений: 2)
Ответ на: комментарий от CryAngel

там у проекта была предыстория, что он сначала собирался на винде, потом его перекомпилировали с той же кроссплатформенной библиотекой под линукс , и вот я в линуксе собрал библиотеку hidapi под него.

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

кое-что еще прояснилось. на своем устройстве, которое я мучаю, я отправил сначала заведомо неправильное количество байт, и оно прислало то, что было раньше

"Параметр задан неверно"
потом послал правильное количество байтов и ошибка изменилась
"Присоединенное к системе устройство не работает."
(p.s.: храни господь за «эта штука смогла» xaizek)

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

т.е. ты сейчас запускаешь в линуксе? если так, то может быть наоборот, где-то в коде устанавливается виндовая кодировка, можно поискать и убрать/закомментировать. это все к теме топика не относится, но, подозреваю, это не последняя ошибка, и возможность прочитать текст сообщения еще пригодится.

CryAngel
()
Ответ на: комментарий от CryAngel

это, конечно. все я сделаю. в конце концов, просто буду ковырять, что там понаделано, но главный мой враг - железяка, которая нагло игнорирует все мои попытки достучаться до нее

Tumyq
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.