На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Перечислить USB-устройства
    Буэнос диас, амигос!

    Настал момент, надо поработать с USB-устройствами. Нашел либу libusb и решил сделать сабж.
    Вывод решил оформить как в линуксовой команде lsusb, типа:

    user posted image

    но моя сборка под Линукс выдает вот так:

    user posted image

    Ладно, думаю, соберу под Винду, посмотрю как там (Линух был на виртуалке, Винда на железе):

    user posted image

    Собственно, вопросы, которые возникли:

    1) Что с моей прогой не так под Линухом, штатная же команда lsusb выводит описалова
    2) Что с моей прогой не так под Виндой, почему столько устройств не опознано, и откуда в описалове вопросы (локаль не та или что?)

    Вот код:

    ExpandedWrap disabled
      #include <iostream>
      #include <iomanip>
      #include <cstring>
      #include "libusb.h"
       
      using namespace std;
       
      void print_device(libusb_device *dev) {
        struct libusb_device_descriptor desc;
        libusb_device_handle *handle = NULL;
        unsigned char str[256] = {0};
       
        if (libusb_get_device_descriptor(dev, &desc) < 0) {
          cout << "failed to get device descriptor" << endl;
          return;
        }
       
        cout << "Bus " << std::setfill('0') << std::setw(3) << hex << +libusb_get_bus_number(dev) << " "
             << "Device " << std::setfill('0') << std::setw(3) << hex << +libusb_get_device_address(dev) << ": "
             << "ID " << std::setfill('0') << std::setw(4) << hex << desc.idVendor << ":"
             << std::setfill('0') << std::setw(4) << hex << desc.idProduct;
        
        if (libusb_open(dev, &handle) == LIBUSB_SUCCESS) {
          if (desc.iProduct) {
            if (libusb_get_string_descriptor_ascii(handle, desc.iProduct, str, sizeof(str)) > 0) {
              string s(reinterpret_cast<char*>(str));
              cout << " " << s.substr(s.find_first_not_of(" \t"));
            }
          }
        } else cout << " -";
        cout << endl;
        if (handle) libusb_close(handle);
      }
       
      int main() {
        libusb_device **devs;
        ssize_t cnt;
        if (libusb_init(NULL) < 0) return 1;
        cnt = libusb_get_device_list(NULL, &devs);
        if (cnt < 0) return 1;
        for (int i = 0; devs[i]; i++) print_device(devs[i]);
        libusb_free_device_list(devs, 1);
        libusb_exit(NULL);
        return 0;
      }


    UPD

    Запуск проги под Линуксом, но с правами рута несколько изменил картину:

    user posted image
    Сообщение отредактировано: JoeUser -
      0) libusb - кривая сома по себе.
      Инициализация у вас не правильно.
      ExpandedWrap disabled
            libusb_init(NULL);
            libusb_set_debug(NULL, 255); // необходимо добавить

      Честно не помню уже для чего но исходный код libusb открыт можете посмотреть.

      1) По первому вопросу у вас основная ошибка в том что вы не подключились к драйверу
      libusb_get_string_descriptor_ascii выполняет посылки на устройства, а без подсоединения к драйверу это не будет работать.И да если вы забудете отсоединится, то повторно тоже работать не будет.
      Так что нужен вот такой вот код:
      ExpandedWrap disabled
            fHadnle = libusb_open_device_with_vid_pid(NULL, MyDevice_VID, MyDevice_PID);
            fFailed=false;
            int ck=-1;
            if (fHadnle==NULL)
            {
                fFailed=true;
            } else {
                const int INTERFACE = 0;
                if (libusb_kernel_driver_active(fHadnle, INTERFACE))
                    libusb_detach_kernel_driver(fHadnle, INTERFACE);
                ck = libusb_claim_interface(fHadnle, INTERFACE);
            }
            if (ck<0)
            {
                      qDebug(lError) << "Ошибка захвата USB интерфейса=" << libusb_error_name(ck);
                      fFailed=true;
            }

      а вот после него можете вызывать свой libusb_get_string_descriptor_ascii

      2)
      По второму вопросу. Это от консоли не зависит и вообще насколько помню это принципиально не решается. Но вы можете попробовать разные драйверы(провайдеры) их в том году было 3 штуки:
      - libusbK-3.0.7.0-bin-chk
      - два других не помню.
        Цитата Pavia @
        Честно не помню уже для чего

        Я помню :) Это чтобы либа могла сбрасывать в stderr протокол в нужном уровне дебаг-сообщений.
        Поэтому это не неправильно. Я нашел для себя чуток полезного кода из исходников либы:
        ExpandedWrap disabled
          enum libusb_error {
               LIBUSB_SUCCESS = 0,
               LIBUSB_ERROR_IO = -1,
               LIBUSB_ERROR_INVALID_PARAM = -2,
               LIBUSB_ERROR_ACCESS = -3,
               LIBUSB_ERROR_NO_DEVICE = -4,
               LIBUSB_ERROR_NOT_FOUND = -5,
               LIBUSB_ERROR_BUSY = -6,
               LIBUSB_ERROR_TIMEOUT = -7,
               LIBUSB_ERROR_OVERFLOW = -8,
               LIBUSB_ERROR_PIPE = -9,
               LIBUSB_ERROR_INTERRUPTED = -10,
               LIBUSB_ERROR_NO_MEM = -11,
               LIBUSB_ERROR_NOT_SUPPORTED = -12,
            
               /* NB: Remember to update LIBUSB_ERROR_COUNT below as well as the
                  message strings in strerror.c when adding new error codes here. */
            
               LIBUSB_ERROR_OTHER = -99,
           };


        Добавлено
        Цитата Pavia @
        libusb_kernel_driver_active(fHadnle, INTERFACE)

        Это *nix only. Но я и без подключения к нему вытягиваю описания. См UPD, только рутовые права нужны оказались.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0311 ]   [ 16 queries used ]   [ Generated: 19.04.24, 23:51 GMT ]