V-USB - как передать массив (структуру) из C# проекта.

Тема в разделе "Arduino & Shields", создана пользователем Vitalii, 26 мар 2014.

  1. Vitalii

    Vitalii Нуб

    Уже голову сломал. может есть у кого простой примерчик. интересует взаимодействие с Атмегой по УСБ. необходимо передавать данные на устройство.

    В атмеге:
    есть такая структура:
    Код (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#.
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Ничего не понял. Что именно нужно написать на C#?
     
  3. Vitalii

    Vitalii Нуб

    Пытаюсь написать простое приложение с минимумом - найти устройство - и отправить некоторые данные. пример прошивки для МК атмега168 делал по этой статье.
    http://we.easyelectronics.ru/electro-and-pc/usb-dlya-avr-chast-2-hid-class-na-v-usb.html.
    Пример Хоста из этой статьи нормально (без УСТАНОВКИ дополнительных драйверов - а это основной критерий выбора либы - поэтому либа LibUsbDotNet отпадает!!) нормально общается с HID устройством на Атмега. Вопрос в том что надо написать тоже самое только на C#.
     
  4. Vitalii

    Vitalii Нуб

    долгие поиски либы для C# дали результат. теперь устройство принимает сообщения от ПК. Теперь возник такой вопрос. я все данные принимаю в структуру с полями типа byte, передаю так само - тип byte. Так как в дескрипторе устройства установленно :
    Код (Text):
    0x75, 0x08,    //    REPORT_SIZE (8)
    .
    теперь собственно вопрос - а как передать значения int или float?
     
  5. sZOOn

    sZOOn Нерд

    Может, поможет: передавал массив из (строка из 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]; и далее до конца массива-строки.

     
  6. Dead_silence

    Dead_silence Нуб

    что за либа? И если можно пример как вы это делаете
     
  7. ринат81

    ринат81 Нуб