Передача данных на хост через USB на высокой скорости

Я говорю с изготовленным на заказ лабораторным устройством (маленькой аппаратной штукой) через USB-соединение. Как получить данные с лабораторного устройства на максимальной скорости?

Хост - это компьютер под управлением Windows XP, на котором выполняется c-код с использованием libsub-win32 в Visual Studio. Маленькая аппаратная штуковина собирает данные, много данных. Хост может запросить эти данные, а затем прочитать их. Все работает нормально. Что меня беспокоит, так это скорость, приблизительная оценка - 1 Мбит / с, что далеко от 480 Мбит / с, поддерживаемых USB2. Устройство должно иметь возможность отправлять мне данные как минимум с такой скоростью. У меня практически нет опыта работы ни с USB, ни с libusb-win32, но я попытался прочитать о них. Хотя я не вижу, где и как менять какие-либо настройки USB-связи. В спецификации, похоже, есть что-то, называемое микрокадрами на высокоскоростных автобусах. Как я могу их использовать?

Мне не обязательно использовать библиотеку libusb-win32. Есть ли у вас другие рекомендации?

Подробная информация о текущей реализации: Как упоминалось выше, я использую libusb-win32 для связи. Вся инициализация скопирована из небольшого примера, включенного в загрузку.

usb_init(); 
...
usb_open();
usb_set_configuration(...);
usb_claim_interface(...);

Затем я разговариваю (используя usb_bulk_write (...) и usb_bulk_read (...)) с лабораторным устройством и убеждаю его поделиться со мной своими данными, что он и делает. Он дает мне данные кусками по 512 байт. Каждый такой фрагмент читается с помощью usb_bulk_read (...).

Редактировать 27 апреля 2011 г .: Похоже, я использую полную скорость, но не высокую скорость. Как мне получить высокую скорость? Я неправильно указал какой-то параметр в файле дескриптора usb? (Да, я использую USB2.0, и устройство должно поддерживать высокую скорость.)


Редактировать 17 мая 2011 г .: Я реализовал связь с помощью winUSB (написал файл .inf и программу на C ++). Преимущество использования WinUSB заключается в том, что он может сказать мне, пытается ли он использовать высокую скорость или нет. И это так, но я все равно не получаю больше, чем около 11 + -2 Мбит / с. Почему?

В соответствии с протоколом USB2.0 компьютер должен отправлять маркер начала кадра (отправляется каждые мс), что, я думаю, он и делает - таким образом, 11 Мбит / с. Но при использовании высокой скорости он говорит, что «высокая скорость использует 'Microframe' длиной 125 мкс (8 микрофреймов в миллисекунду). Соответствие с нумерацией кадров в 1 мс поддерживается в высокоскоростных пакетах SOF путем повторения номера каждого кадра в 8 последовательных Микрофреймы ". Я не совсем понимаю это, но проблема может быть в недостаточной отправке микрокадров? Не мог бы кто-нибудь, кто разбирается в протоколе, просветите меня! Я хочу понять, как это работает, независимо от того, смогу ли я заставить его работать на моем компьютере или нет.


Изменить 15 июня

Проблема решена: никакие изменения на стороне компьютера не могут сделать связь быстрее, чем хотелось бы (если вы не измените количество конечных точек и у вас действительно есть соединение USB2.0). Проблема заключалась в коде процессора, который очень долго использовал свои области памяти. Это делает этот вопрос чем-то вроде вопроса. Спасибо за все указатели и информацию. Я многое узнал о USB!


person AnnaR    schedule 20.04.2011    source источник
comment
Возникает вопрос: «Как работает протокол USB2?» или это «Как мне получить полную скорость под Win32?» Вопросы рядом с этим: вы используете изохронный или блочный перенос? Достаточно ли у вас очереди буферов и всегда есть пара ожидающих обработки?   -  person Christopher    schedule 17.05.2011
comment
Вопрос в том, как мне получить полную скорость. Я использую блочные передачи, имею два буфера, но я ничего не делаю с данными, которые получаю прямо сейчас. Просто переработайте буфер, т. Е. Используйте его снова, чтобы получить больше данных.   -  person AnnaR    schedule 18.05.2011
comment
Вы используете 3 или более операций чтения с перекрытием? Это из второй трубы, а не из трубы по умолчанию? Достаточно ли велики буферы или вы получаете много маленьких буферов?   -  person Christopher    schedule 18.05.2011
comment
Никаких дублирующих чтений - я не уверен, что вы имеете в виду. Чтение из конечной точки, отличной от заданной по умолчанию. Я пробовал с огромным буфером и маленькими буферами - но не увидел разницы в производительности.   -  person AnnaR    schedule 19.05.2011
comment
Дело в том, что вам нужно использовать перекрывающийся ввод-вывод, чтобы всегда иметь следующий буфер в очереди, чтобы никогда не терять данные. Ссылка MsDN   -  person Christopher    schedule 19.05.2011


Ответы (3)


Попробуйте использовать официальный драйвер Microsoft WinUSB, думаю поможет. Также вы можете найти примеры того, как его использовать веб-сайт Яна Аксельсона, в частности эта страница посвящена WinUSB. В качестве дополнительного аргумента даже LibUSB полагается на WinUSB.

Я хотел бы спросить вас, какой тип устройства это ваше лабораторное устройство: HID, CDC и т. Д.? потому что это также зависит от вашего внутреннего устройства. Это HID (мышь, клавиатура), вы не можете ожидать сверхскорости.

person garzanti    schedule 24.04.2011
comment
CDC_COM_CLASS. Это устройство, собирающее большие объемы данных ... Спасибо за сайт - сейчас я собираюсь погрузиться в него. Я очень надеюсь, что это даст мне несколько ответов. - person AnnaR; 26.04.2011

Вам действительно необходимо проверить, в каком режиме работает ваше USB-устройство. Для этого откройте Диспетчер устройств, затем перейдите: «Просмотр» -> «Устройства по подключению».

Теперь вам нужно свернуть дерево устройств на свое USB-устройство. Он будет находиться за одним из «стандартных хост-контроллеров USB XYZ».

С помощью XYZ вы можете определить, какая у него скорость: высокая или полная / низкая: если XYZ имеет значение «Enhanced PCI to USB», то устройство действительно работает на высокой скорости 480 Мбит / с. Но если хост-контроллер верхнего уровня - это «OpenHCD USB» или что-то еще (вероятно, что-то с UHCI, у меня здесь нет платы Intel), устройство работает на полной скорости - максимум 12 Мбит / с. Многие микроконтроллеры «USB 2.0» поддерживают только полную скорость, но не высокую скорость.

Обновлять

Устройство работает на полной скорости в следующих случаях:

  • Между ними есть концентратор USB 1.1, который не может говорить на высокой скорости
  • Устройство может разговаривать только само на полной скорости.
person Turbo J    schedule 01.05.2011
comment
Большое спасибо за информацию. Я все искал и искал, как узнать больше о разъемах USB в компьютере. Нигде я не нашел этого написанного так ясно, как выше! К сожалению, это не решило мою первоначальную проблему, но я, по крайней мере, узнал что-то новое. - person AnnaR; 02.05.2011

Как вы рассчитываете скорость передачи данных?

  1. Либо расчет скорости передачи данных МОЖЕТ быть неверным, либо
  2. Количество потоков, обрабатывающих передачу данных, меньше; а следовательно и скорость меньше.

Я не использовал библиотеку libusb-win32 и глубоко не работал с USB, но эти моменты могут помочь вам найти настоящую основную причину или проблему, если таковая имеется.

person aeon    schedule 21.04.2011
comment
Передача примерно 0,5 Мбит заняла 0,4 секунды. Проверял время до передачи и после передачи и вычитал. - person AnnaR; 21.04.2011
comment
Используете ли вы какой-либо брандмауэр / антивирус или другие вещи, которые могут немного замедлить работу? Можете ли вы на самом деле написать простой журнал, в котором записывается количество полученных байтов вместе с отметкой времени, чтобы вы могли просто открыть журнал, проверить байты, полученные за период времени, и получить сравнительно более надежный способ расчета скорости загрузки, чем тот, который вы делаем сейчас? Однако это должно выполняться в каждом потоке, который обрабатывает файл загрузки / чтения (или аналогичный) из порта USB COM. - person aeon; 21.04.2011