Уже голову сломал. может есть у кого простой примерчик. интересует взаимодействие с Атмегой по УСБ. необходимо передавать данные на устройство. В атмеге: есть такая структура: Код (Text): struct dataexchange_t { uchar b1; uchar b2; uchar b3; }; и дескриптор: Код (Text): PROGMEM char usbHidReportDescriptor[22] = { // USB report descriptor 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, sizeof(struct dataexchange_t), // REPORT_COUNT 0x09, 0x00, // USAGE (Undefined) 0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) 0xc0 // END_COLLECTION }; Загвоздка в том что не могу правильно написать функции usbFunctionWrite() и usbFunctionSetup() для приема устройством пакетаданных (структуры) от хоста. С ПО хоста так само - не пойму как передать эту самую структуру. ПО Хоста пишется на C#.
Пытаюсь написать простое приложение с минимумом - найти устройство - и отправить некоторые данные. пример прошивки для МК атмега168 делал по этой статье. http://we.easyelectronics.ru/electro-and-pc/usb-dlya-avr-chast-2-hid-class-na-v-usb.html. Пример Хоста из этой статьи нормально (без УСТАНОВКИ дополнительных драйверов - а это основной критерий выбора либы - поэтому либа LibUsbDotNet отпадает!!) нормально общается с HID устройством на Атмега. Вопрос в том что надо написать тоже самое только на C#.
долгие поиски либы для C# дали результат. теперь устройство принимает сообщения от ПК. Теперь возник такой вопрос. я все данные принимаю в структуру с полями типа byte, передаю так само - тип byte. Так как в дескрипторе устройства установленно : Код (Text): 0x75, 0x08, // REPORT_SIZE (8) . теперь собственно вопрос - а как передать значения int или float?
Может, поможет: передавал массив из (строка из 8 чисел, 4096 строк) интов через переменную байт, число максимальное 4096, 2 байта сшивались в скетче. В С# : строка-массив собиралась OutputString[0] = (byte)(numericUpDown1.Value * MaxPWMDevice / MaxPWM / 256); по индексам и отправлялась процедурой serialPortArduino.Write(OutputString, 0, 18); Здесь некоторые служебные константы. В скетче int InByte [18]; for (int j = 0; j < 18; j++) {InByte [j] = Serial.read();} - заполнение массива, преобразование 2-х байт в число: red = InByte[0] * 256 + InByte[1]; и далее до конца массива-строки.