Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2016, 20:02   #1
DimaTopius
 
Регистрация: 16.05.2016
Сообщений: 3
По умолчанию .NET 4.x Чтение данных с Hid устроства с использованием HidSharp.dll

Добрый день.
Пытаюсь решить проблему как же правильно считать с HID устройства нужные мне байты.
На данный момент я умею передавать данные в устройство с ПК. В C# делаю это так:
Код:
HidStream stream = device.Open();
                            stream.Write(DataOutput);
                            stream.Close();
Устройство с двумя конечными точками (In и Out), вот их дескрипторы:
C++
Код:
                //EP1Descr
                0x07,// 52
                0x05,// 53
                0x81,
                0x02,// 55
                0x40,
                0x00,// 57
                0x01,// 58
                //EP2Deskr
                0x07,// 59
                0x05,
                0x02,// 61
                0x02,
                0x40,// 63
                0x00,
                0x01,// 65
А также дескриптор репорта:
C++
Код:
               0x06, 0x00, 0xff,         //   USAGE_PAGE (Generic Desktop)  //81
                   0x09, 0x01,               //   USAGE (Vendor Usage 1)
                   0xa1, 0x01,               //   COLLECTION (Application)  //85
                      0x09, 0x01,               //   USAGE (Vendor Usage 1)
                      0x15, 0x00,               //   LOGICAL_MINIMUM (0)    //89
                      0x26, 0xff, 0x00,         //   LOGICAL_MAXIMUM (255)
                      0x75, 0x08,               //   REPORT_SIZE (8)    //94
                      0x95, 0x0F,               //   REPORT_COUNT (1)
                      0x91, 0x82,               //   OUTPUT (Data,Var,Abs,Vol)  //98
 
                      0x09, 0x02,               //   USAGE (Vendor Usage 2)
                      0x15, 0x00,               //   LOGICAL_MINIMUM (0)    //102
                      0x26, 0xff, 0x00,         //   LOGICAL_MAXIMUM (255)
                      0x75, 0x08,               //   REPORT_SIZE (8)    //107
                      0x95, 0x0F,               //   REPORT_COUNT (1)
                      0x81, 0x82,               //   INPUT (Data,Var,Abs,Vol)   //111
                   0xc0,                  //   END_COLLECTION   //112
На компьютере в программе USBlyzer все дескрипторы видны и устройство прошло успешно "Enumeraition".
Теперь хочу считать с устройства 3 байта, делаю это в приложении C# следующим способом:
Код:
                    HidStream stream1;
                    device.TryOpen(out stream1);
                    using (stream1)
                    {
                        var bytes = new byte[3];
                        bytes[0] = 2;
                        stream1.Read(bytes);
                    }
                    stream1.Close();
Но секунды через 3 вылетает ошибка что время вышло. Смотрел в отладки регистры контроллера USB точек прерывания (флаги прерывания) и нового запроса не было. Такое чувство что я не умею правильно ссылаться на конечную точку отвечающую за передачу из USB контроллера в компьютер.
Такая проблема. Просьба подсказать:
Как вообще реализовать передачу из USB контроллера в ПК?
Как ПК выбирает конечную точку для приема и передачи? Связан ли номер конечной точки в дескрипторе с этой процедурой?
Как правильно пользоваться библиотекой HidSharp чтобы считать данные с устройства? (никаких флагов прерывания при выполнении последней части кода не возникает как будто до USB контроллера не доходит запрос. При передаче данных из ПК флаги и запрос появляется в EP0)
Влияет ли первый байт "bytes[0] = 2;" на что либо? (Пробовал так и 0) Читал что он не используется для передачи и приема данных и как-то влияет на Report ID, но не до конца понятно как он это делает и что это такое.
Заранее спасибо.
DimaTopius вне форума Ответить с цитированием
Старый 05.10.2016, 19:45   #2
Ybrjkfif
 
Регистрация: 26.09.2016
Сообщений: 8
По умолчанию

Доброго времени суток.
Можете подсказать? Нужно получить 64 байта данных с USB HID устройства.
Ybrjkfif вне форума Ответить с цитированием
Старый 05.10.2016, 21:46   #3
DimaTopius
 
Регистрация: 16.05.2016
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Ybrjkfif Посмотреть сообщение
Доброго времени суток.
Можете подсказать? Нужно получить 64 байта данных с USB HID устройства.
Добрый день!
Спасибо что откликнулись, мне надо передать с hid usb устройства в компьютер 15 байт и в hid usb устройство с компьютера 15 байт. Но я не понимаю как это сделать с тем,что я имею.
DimaTopius вне форума Ответить с цитированием
Старый 06.10.2016, 13:14   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Не знаю как в вашей библиотеке, но усб ждет от любого источника пакет в 64 байта. Это обязательно.
Вот есть библиотека для работу с усб. В ней все достаточно просто.


Код:
В коде формы разместить функции:
 protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            USB1.RegisterHandle(Handle);
        }

        protected override void WndProc(ref Message m)
        {
            USB1.ParseMessages(ref m);
            base.WndProc(ref m);	// pass message on to base form
        }

// подключение
USB1.ProductId = Convert.ToInt16(ProductsBox.Text, 16);
USB1.VendorId = Convert.ToInt16(VendorBox.Text, 16);
USB1.CheckDevicePresent();

// отправка
 if (USB1.SpecifiedDevice != null)
{
Data.Output[0] = 0x00; // весь блок 64 байта!!!
USB1.SpecifiedDevice.SendData(Data.Output);
}
else MessageBox.Show("Девайс не подключен");

// событие приема
private void USB1_OnDataRecieved(object sender, DataRecievedEventArgs args)
        {
            Data.Input = args.data; // принимаем данные 64 байта            
        }
Вложения
Тип файла: 7z Release.7z (14.5 Кб, 52 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 06.10.2016, 18:54   #5
DimaTopius
 
Регистрация: 16.05.2016
Сообщений: 3
По умолчанию

Добрый день!
Вопрос:
функции
Код:
OnHandleCreated
и
Код:
WndProc
к чему они привязаны? кто их вызывает? ну там для формы все методы прописаны в diseing.
Я обязательно попробую сделать это по Вашему примеру.
И насколько я изучал Агурова, размер принятых и отправленных байт зависит от:
Код:
                      0x95, 0x0F,               //   REPORT_COUNT (1)
-15байт.
но самый важный вопрос правильно ли составлен hid descriptor?
DimaTopius вне форума Ответить с цитированием
Старый 06.10.2016, 21:27   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от DimaTopius Посмотреть сообщение
Добрый день!
Вопрос:
функции к чему они привязаны? кто их вызывает?
Это переопределенные функции класса Forms и базового класса обработчика сообщений оконного приложения. Вызываются системой и доп.привязки не требуют. достаточно в коде формы расположить их.



Цитата:
Сообщение от DimaTopius Посмотреть сообщение
но самый важный вопрос правильно ли составлен hid descriptor?
Вообще весь протокол USB разрабатывали явно тяжело больные психически люди. разбираться с внутренней структурой дескрипторов, булок и пайпов это еще то извращение над мозгом. Конечно почитать для общего развития можно... но эта библиотека это самое простое что нашлось для работы с хидом. Сам использовал эту библиотеку для программы которая работает с устройствами на базе микроконтроллеров PIC. Только прописать пид и вид и работа идет на ура, без сложных обработок.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 16.10.2016, 19:23   #7
Ybrjkfif
 
Регистрация: 26.09.2016
Сообщений: 8
По умолчанию

Уважаемый, WorldMaster, могли бы Вы объяснить, что за объект с именем "Data", то есть как он объявляется в коде? Если есть возможность, можете код целиком показать по приёму 64 байт данных? Просто достаточно давно пытаюсь сделать это, но уровень программирования достаточно мал, как я недавно понял, для реализации этого.

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Код:
// событие приема
private void USB1_OnDataRecieved(object sender, DataRecievedEventArgs args)
        {
            Data.Input = args.data; // принимаем данные 64 байта            
        }
Ybrjkfif вне форума Ответить с цитированием
Старый 16.10.2016, 23:21   #8
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Это просто массив данных .. byte[] Data = new byte[64]
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 17.10.2016, 12:59   #9
Ybrjkfif
 
Регистрация: 26.09.2016
Сообщений: 8
По умолчанию

Добрый день, WorldMaster, спасибо за ответ, но Visual Studio, тем не менее выдаёт ошибку по поводу метода "Input": "System.Array" не содержит определения для "Input" и не был найден метод расширения "Input", принимающий тип "System.Array" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Это просто массив данных .. byte[] Data = new byte[64]
Ybrjkfif вне форума Ответить с цитированием
Старый 17.10.2016, 21:37   #10
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Да сделайте вы вот так:
Код:
byte[] Data = args.data; /
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не получается линкнуть hid.dll wanes101 Visual C++ 3 05.01.2016 09:39
USB ручной сканер. Перехват данных в HID режиме VitalyaVentel Общие вопросы Delphi 14 28.11.2012 09:31
Чтение файла с использованием TFileStream Desha Помощь студентам 0 13.05.2011 22:18
Проблема с использованием Net Use Rovert Операционные системы общие вопросы 2 21.07.2010 07:39
Многопоточный код на C++ с использованием .NET UltroMain Общие вопросы .NET 1 27.12.2009 23:20