Терминал для DigiUSB.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
Теперь по поводу HEX, DEC. Я слегка удивлён, что вы тут все дружно начали тупить и смешивать понятия хранения и отображения. HEX, DEC это всего лишь формат для отображения информации в удобном для человека виде. Попгуглите "C++ printf" и почитайте там про %x.

никто не начал тупить, кроме тебя - char у меня хранится в формате числа в диапазоне от -128 до 127.

проблемы хранения нет - есть проблема выбора формата вывода на экран в читабельном виде непечатных значений char.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015
 
 
сделано:
 
- добавлен вывод в текстовый файл:
received_digiusb.txt - получено из DigiUSB.
sent_digiusb.txt - отправлено в DigiUSB.
файлы создаются-открываются в режиме записи в конец текстового файла.
 
- изменён вывод в экран и текстовый файл непечатных символов ASCII:
 
непечатные символы выводятся в виде [d], где d - целое десятичное со знаком.*
т.е. [-128]...[31] и [127].
 
в то время, как:
 
печатные символы [32]...[126] выводятся в виде букв, цифр и знаков препинания.
 
управляющие символы
BS  \b [ 8]
TAB \t [ 9]
LF  \n [10] (Windows)
CR  \r [13]
LF  \n [17] (Unix)
выполняют функции управления выводом.
 
---------
*удобный формат представления, когда на стороне контроллера DigiUSB нужно анализировать полученное.
пример:
char ch;
if (ch == d) {}
 
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001,  " юзаем корректно работающую замену DigiUSB.println("text") -> DigiUSB.print("text\n")."

А как вывести содежимое переменной, а не текст?

PS кажись разобрался:

DigiUSB.print(test);
DigiUSB.print("\n");

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:
DigiUSB.print("\n");

DigiUSB.print('\n');

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

я не знаю, почему так, но подозреваю, что в этом по сути есть ошибка:

Serial.println() 
Передает данные через последовательное соединение как ASCII текст с следующим за ним символом переноса строки (ASCII символ 13 или '\r') и символом новой строки (ASCII 10 или '\n').

т.е. : печатаем текст/значение/прочее, на этой же строке переводим каретку в начало, затем на одну строку вниз.

что у нас получается при переводе каретки назад по уже напечатанному?, попробуйте в текстовом редакторе - текст, сцуко, стирается... канечно, потом переводим каретку на одну строку вниз - красавцы, чо.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

DigiUSB.print(test);
DigiUSB.print("\n");

ещё попробуй вариант

DigiUSB.print(test + '\n');

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001, DigiUSB.print(test + '\n');  так всё равно в одну строчку выводит..

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

Клапауций 001, DigiUSB.print(test + '\n');  так всё равно в одну строчку выводит..

какой тип переменной test у тебя?

специально проверил DigiUSB.print(millis() + '\n') - работает. соврал - не работает

*по сути - это не ко мне вопросы, а к пейсателям класса print Дуино ИДЕ.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

uint32_t freq=1000;
DigiUSB.print(freq + '\n');

С миллисом тоже не переводит строку, как ни странно.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001, мне "game mode" очень понравилась, можно стрелками клавиатуры пользоваться как энкодерами. Реально круто :)

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

да - я так и подумал, что кнопка "ввод" нафиг не нужна.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:


uint32_t freq=1000;
DigiUSB.print(freq + '\n');

С миллисом тоже не переводит строку, как ни странно.

смотри, что бы прибавить символ к переменной - у тебя должна быть переменная типа строка

попробуй: DigiUSB.print(String(millis()) + '\n');

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001, да, так всё ок! Но меня в принципе устраивало и просто  холостую строчку выводить  с \n 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

ок.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

проверил свои предположения #55

Print.cpp

size_t Print::println(void)
{
  // return write("\r\n");
  return write("\n\r");
}

теперь println() корректно работает в терминале // некорректно - \r лишняя.

*владельцам оригинального Digispark фиксить Print.cpp в папках *\digistump\* - не проверял.

size_t Print::println(void)
{
  // size_t n = print('\r');
  // n += print('\n');
  // fix.
  size_t n = print('\n');
  n += print('\r');
  return n;
}
int Print::println(void)
{
  // print('\r');
  // print('\n');
// fix.
  print('\n');
  print('\r');
  return( 2 );
}
Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax, сделай доброе дело - проверь в сериал-мониторе фикс Print.cpp

size_t Print::println(void)
{
  // return write("\r\n");
  return write("\n"); // fix.
}

корректно работает println()? , а то не пойму, что делает \r в коде?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001, работает и так

int Print::println(void)
{
  print('\n');  
  print('\r');
  return( 2 );
}

и так:

int Print::println(void)
{
  print('\n');  
  return( 2 );
}

А так глючит:

int Print::println(void)
{
  print('\r');
  print('\n');  
  return( 2 );
}

 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

Клапауций 001, работает и так

int Print::println(void)
{
  print('\n');  
  print('\r');
  return( 2 );
}

и так:

int Print::println(void)
{
  print('\n');  
  return( 2 );
}

и, как думаешь, что делает '\r' в оригинальном коде?

dimax пишет:

А так глючит:

int Print::println(void)
{
  print('\r');
  print('\n');  
  return( 2 );
}

это оригинальный код ядра дижиспарка \tiny\ - не должно.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001,  фик знает. По идее писать на одной строчке, в качестве отдельной функции было бы интересно. Но зачем это там не ясно..

Клапауций 001
Offline
Зарегистрирован: 05.09.2015
 
 
сделано:
 
- теперь можно отправлять строку символов в терминал из консоли CMD Windows в формате
digiusb 1234send_command
или
digiusb "1234 send command"
где "digiusb" - имя файла программы терминала, "1234send_command" - строка, отправляемая терминал.
в контроллер DigiUSB будут отправлены символы 1234send_command + \n (символ перевода строки).
строка отправляется посимвольно, после чего работа программы терминала завершается, запись в текстовые файлы и сообщения об ошибках выполнения не производится - подразумевается, что программно-аппаратная отладка произведена в терминале, запущенным обычным образом и неполадок не предвидится.
 
Клапауций 070
Offline
Зарегистрирован: 26.09.2015

MATRIX


#include <DigiUSB.h>

void setup() {
randomSeed(666);
DigiUSB.begin();
}

void loop() {

static String b = "                                                                                                    ";

static byte n = b.length();

if  (DigiUSB.tx_remaining() > (n + 1)) {

for ( byte i = 0; i <= n; i++) {if (b.charAt   (i) ==     32      ) {
if  (!random(0,  81))              {b.setCharAt(i, random(33, 127));}
}
}

for ( byte i = 0; i <= n; i++) {if (b.charAt   (i) !=     32      ) {
if  (!random(0,  11))              {b.setCharAt(i,        32      );}
else                               {b.setCharAt(i, random(33, 127));}
}
}

DigiUSB.println(b);

}

DigiUSB.delay(1);

}

 

iotdev
Offline
Зарегистрирован: 13.10.2015

что-то не видится у меня девайс, терминал пишет - "DigiUSB no found"...
в ОС (XP SP2) HID девайс в наличии - USB\VID_16C0&PID_05DF
libusb той версии, которую поставила программа установки драйвера от Digistump (а именно 1.2.6.0)
сам девайс работает как положено, USB клавиатура нажимает кнопки и переключает Caps lock,
USB мышь двигает курсор, джойстик тоже двигается
usb-serial тоже работает, а вот DigiUSB не видится этим терминалом
я даже добавлял поддержку USB_CFG_IMPLEMENT_FN_WRITE и USB_CFG_IMPLEMENT_FN_READ из
http://digistump.com/board/index.php/topic,944.msg7264.html, не помогло...
 

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

iotdev пишет:

а вот DigiUSB не видится этим терминалом

а, каким видится?

я проверял работу всех версий терминала на XP и 7

драйвера последние, идущие в комплекте с дижистамп 1.6.5

вспомнил, думал, очевидно: инсталлятор драйверов под XP работает некорректно - устанавливать вручную указывая для устройства файл DigiUSB.inf

*опубликуй сюда скетч, который ты заливаешь.

**каким боком там ява? - ехе на C++

iotdev
Offline
Зарегистрирован: 13.10.2015

решилась проблема, спасибо за подсказку)

порядок действий такой - скачать libusb с http://sourceforge.net/projects/libusb-win32/files/, установить драйвер-фильтр для устройства digispark при помощи программы установки bin\{x86|amd64}\install-filter-win.exe, проверить в TestLibUsb-win.exe что девайс digispark видится через libusb , ну и всё)

никакими другими терминалами не проверял, я уже выбрал для себя этот терминал, не люблю когда таскается куча лишних библиотек) скетч примитивный, а-ля hello world

про джаву - даже не знаю зачем написал, может пригодится кому для управления через javahidapi, в конце-концов ардуниостудия на джаве, и там можно запилить USB-HID терминал в дополнение к терминалу ком-порта...

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

iotdev пишет:

порядок действий такой - скачать libusb с http://sourceforge.net/projects/libusb-win32/files/, установить драйвер-фильтр для устройства digispark при помощи программы установки bin\{x86|amd64}\install-filter-win.exe, проверить в TestLibUsb-win.exe что девайс digispark видится через libusb , ну и всё)

отказался я от юзания этой халабуды, после того, как она у меня вызывала синий экран на XP при любом шаге вправо-влево.

Клапауций 911
Offline
Зарегистрирован: 18.10.2015
редактор строки на стороне контроллера DigiUSB.
 
т.к. монитор-терминал для Digispark DigiUSB отправляет вводимые с клавиатуры символы безусловно и немедленно, то если требуется редактировать введённую строку, то делать это нужно уже на стороне контроллера DigiUSB.
поэтому, пилим редактор строки на контроллере AVR с помощью функций класса String.
 
берём
length(); // возвращает число знаков в строке.
и
remove(n); // удаление n-го символа из строки.
 
собираем в конструкцию
b.remove(b.length() - 1); // удаление последнего символа из строки.
 
всё.
 
остаётся привязать функцию к событию получения кода клавиши Backspace.
 
пример скетча зажигающего и гасящего светодиоды активированной с помощью клавиши Enter строкой, которую можно редактировать клавишей Backspace.

#include <DigiUSB.h>

void setup() {

pinMode(14, OUTPUT); // LED_01
digitalWrite(14, 1);
pinMode(15, OUTPUT); // LED_02
digitalWrite(15, 1);

DigiUSB.begin();

}

void loop() {

if (DigiUSB.available()) { // в USB что-то есть.

char a = DigiUSB.read(); // считать символ из USB в переменную.
static String b = ""; // объявление переменной строки.

if (a != '\b') {b = b + a;               } // дописать символ в конец строки, если это не символ клавиши Backspace.
if (a == '\b') {b.remove(b.length() - 1);} // удалить последний символ строки, если получен символ клавиши Backspace.
if (a == '\n') {                           // если получен символ клавиши Enter.

// эхо строки. (необязательная часть кода, используется для отладки)
if (DigiUSB.tx_remaining() > (b.length() + 1)) { // проверка места в буфере USB для строки длиной + 1 символ.
DigiUSB.print(b); // печать в DigiUSB собранной строки.
}

// что-то делаем, после получения символа клавиши Enter.
if (b == "LED_01 on\n") {digitalWrite(14, 0);} // зажечь светодиод, если принята строка ххх\n.
if (b == "LED_01 of\n") {digitalWrite(14, 1);} // погасить светодиод, если принята строка ххх\n.
if (b == "LED_02 on\n") {digitalWrite(15, 0);} // зажечь светодиод, если принята строка ххх\n.
if (b == "LED_02 of\n") {digitalWrite(15, 1);} // погасить светодиод, если принята строка ххх\n.

b = ""; // очистка строки.

}

}

DigiUSB.delay(1);

}

*пилим на базе консольные USB включалки-выключалки, кодовые замки, экзаменаторы, детские игры-головоломки, пр.

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
 
 
исправлено:
 
- убрано условие при котором блокировалась отправка символов из клавиатуры, если в буфере приёма из USB что-то есть. приводило к блокировке отправки символов из клавиатуры в DigiUSB при непрерывном потоке символов из DigiUSB.
- проверка успешного завершения работы функции приёма/отправки сообщений драйверу USB производится немедленно и раздельно для приёмки и отправки сообщений.
fotorobot
Offline
Зарегистрирован: 07.11.2016
1
VaRek
Offline
Зарегистрирован: 12.06.2017

Здравствуйте!

При выборе платы Digispark 16,5 (Tiny85) не компилировался скетч (1.6.5r5 и 1.6.7).

С одной проблемой справился- b.remove(b.length() - 1)

заменив "не знающую remove" WString в папке \AppData\Local\Arduino15\packages\digistump\hardware\avr\1.6.7\cores\tiny

на правильную версию из

\Program Files\Arduino\hardware\arduino\avr\cores\arduino

вторая проблема-atexit в строке DigiUSB.delay(1)

внезапно ушла после многократных попыток компиляции.. возможно, после

автообновления библиотек

Впервые занялся ардуиной, и в шоке.. на ассемблере всё както предсказуемее..

Подскажите, в какой версии вы работаете с Digispark?

И как скачать v03 терминала? На Dropbox её уже нет..

и ещё-поделитесь, пожалуйста digiusb.cpp

lusb0_usb.h хотел бы заменить на новую lusbusbK

Спасибо!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

не знаю - у меня дижиспарк на атмега8 крутится, ядро стандартное, библиотека DigiUSB.h последняя на момент публикации постов.

digiusb_v03_final

файлы библиотек и ядра доступны на ресурсах первоисточников.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

VaRek пишет:

и ещё-поделитесь, пожалуйста digiusb.cpp

исходник валяется где-то на гитхабе дижиспарка - пили его как тебе угодно.

VaRek
Offline
Зарегистрирован: 12.06.2017

Спасибо!

Извините, я хотел попросить Ваш, "допиленный" исходник версии v03 терминала, для изучения.. "Пильщик" из меня пока не очень.

В перспективе хотел бы перевести всё это дело на HiD без libusb0.

Для этого HiDSharp освоить бы.. всмысле, VisualStudio (C# C++)

HiD bootloader заинтересовал. https://habrahabr.ru/post/200896/

Спасибо

P.S. у меня Tiny85, полный клон Digispark, соответственно без кварца, загрузчик калибруется по USB на 16,5 МГц.. А у Вас как он "крутится на меге8" ? Интересно очень. Кварц какой? и загрузчик- v2.03 ? который int0 не использует ?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

VaRek пишет:

Извините, я хотел попросить Ваш, "допиленный" исходник версии v03 терминала, для изучения.. "Пильщик" из меня пока не очень.

ок. на досуге попробую правильно оформить форк оригинального исходника на гитхабе - как бы не мой это исходник, а дижиспарковский и хотелось бы какую-то преемственность сохранить, дабы исключить возможные претензии автора.

VaRek пишет:

Для этого HiDSharp освоить бы.. всмысле, VisualStudio (C# C++)

для этого достаточно текстового редактора и MinGW

VaRek пишет:

А у Вас как он "крутится на меге8" ? Интересно очень. Кварц какой? и загрузчик- v2.03 ? который int0 не использует ?

у меня дижиспарк собран на железе USBasp , кварц 12 мегагерц, загрузчик USBaspLoader, который int0 использует, допаяны две аппаратные кнопки "reset" и "loader".

что бы стало понятно, почему так - читаем файл DigisparkUSB/Readme.txt

This is the Readme file to Objective Development's firmware-only USB driver
for Atmel AVR microcontrollers. For more information please visit
http://www.obdev.at/vusb/

ой. какой такой дижиспарк, если вся эта балалайка - форк V-USB. :D

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

кто в курсе, как из вебморды гитхаба сделать форк одной папки репозитория, а не тащить весь репозиторий?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

была командная строка в морде гитхаба, а теперь где?

68747470733a2f2f662e636c6f75642e67697468

VaRek
Offline
Зарегистрирован: 12.06.2017

Клапауций 112 пишет:

для этого достаточно текстового редактора и MinGW

хочется кнопочки мышкой рисовать :) VB6 когдато изучал. Так и остановился в развитии

Клапауций 112 пишет:

дижиспарк на USBasp , кварц 12 мгц, 

почему так - читаем файл Readme.txt

ой. какой такой дижиспарк, если вся эта балалайка - форк V-USB. :D

#if F_CPU != 16500000L
  #error "You must use Digispark (Tiny Core) board to use USB libraries"
#endif
 
Сам хочу переделать USBASP, но кварц 18 МГц (самый оптимальный по-моему, crc8 поддерживается)
Загрузчик "interrupt-free V-USB"-вход int0, но прерывания запрещены, просто цикл ожидания по-моему.. первая посылка пропускается, зато контроллер успевает подготовить данные, и общая пропускная способность вырастает в разы.. Ковырял свой китайский SaleaeLogiс и наткнулся на  https://cpldcpu.com/2014/03/02/interrupt-free-v-usb/
 
Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

VaRek пишет:

Клапауций 112 пишет:

дижиспарк на USBasp , кварц 12 мгц, 

почему так - читаем файл Readme.txt

ой. какой такой дижиспарк, если вся эта балалайка - форк V-USB. :D

#if F_CPU != 16500000L
  #error "You must use Digispark (Tiny Core) board to use USB libraries"
#endif

We supply assembler modules for clock frequencies of 12 MHz, 12.8 MHz, 15 MHz,
16 MHz, 16.5 MHz 18 MHz and 20 MHz. Other clock rates are not supported. The
actual clock rate must be configured in usbdrv.h unless you use the default
12 MHz.

 

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

VaRek пишет:

Сам хочу переделать USBASP...

я запретил?

VaRek
Offline
Зарегистрирован: 12.06.2017

Клапауций 112 пишет:

VaRek пишет:

Сам хочу переделать USBASP...

я запретил?

вроде нет. Интересовал Ваш опыт в этом вопросе. Спасибо. Жду исходник :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

VaRek пишет:

вроде нет. Интересовал Ваш опыт в этом вопросе. Спасибо. Жду исходник :)

ок. давай начистоту, нафига тебе исходник, если тебе не на чем его собрать и у тебя нет элементарного понимания сути работы дижиспарка?

мне не жалко, но я имею чисто энтомологический интерес к твоим мотивам.

VaRek
Offline
Зарегистрирован: 12.06.2017

Клапауций 112 пишет:

 тебе не на чем его собрать и у тебя нет элементарного понимания сути работы дижиспарка?

эмммм.. понимание сути? какбэ в машинных кодах программировал ещё i8080, собирал (разрабатывал) компы (видеокарта на 22шт TTL микросхем-ностальгия). 8051, Silabs. Имеются платы и Digispark и другие, программаторы, отладчики OlimexUSB, оригинальный JTAGice2. А нет понимания-как может простая прога для DS18B20 сожрать 6 килобайт памяти (скетч из примера Arduino)?? Для меня это хобби, чтоб выплавить холестерин из мозга. У Digistamp старые библиотеки как выяснилось (WString и т.п). Понял, что с АрдуиноIDE имеет смысл использовать.. именно ардуино. Причём с RS232.  Micronucleus интересен как образец, до чего может извратиться человеческий мозг :)  STM32 с USB имеется тоже. Но здесь же.. как тюнинг "Жигулей"! Увлекает! А при разработке плат управления шлагбаумом, холодильником, зажиганием и т.п както обхожусь без ардуино.. Сорри за флуд (вот жаргон перенимаю :)

Ваш пример очень ценен для самообучения (в языках "высокого уровня" отстал..) Спасибо

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

VaRek пишет:

Понял, что с АрдуиноIDE имеет смысл использовать.. именно ардуино.

ок. моя плата, которую я описал выше - это ардуино?

*меня смутило, что я выложил тебе тонну интересной инфы, тебя ничего не заинтересовало, но продолжает интересовать исходник.

выложу, когда пойму, как на гитхабе сделать форк двух файлов проекта.

VaRek
Offline
Зарегистрирован: 12.06.2017

Клапауций 112 пишет:

ок. моя плата, которую я описал выше - это ардуино?

тонну интересной инфы, тебя ничего не заинтересовало, но продолжает интересовать исходник.

Ваша плата (мега8, кварц) более полноценная ардуино, чем моя Digispark Tiny85.

Переделаю USBASP под чистую ардуино (не micronucleus), отладчик Olimex перешью на HiDUSB 18MHz, будет приборный интерфейс (мультиметры с RS232->плата->комп USB->(нечто на VB/C#)->Excel).

Тонну интересной инфы проштудирую.. Может не заметил что-то новое.

И ещё- без pdcurses.dll никак? Может что по исходнику пойму..

Извините, если что.. Может по тексту изложения я кажусь грубым или неблагодарным

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

VaRek пишет:

И ещё- без pdcurses.dll никак? Может что по исходнику пойму..

pdcurses расширяет функционал печати в экран - если без неё, то останется функционал консоли CMD Windows.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
VaRek
Offline
Зарегистрирован: 12.06.2017

Клапауций 112 пишет:

https://github.com/Klapautsiy/DigiUSB

Спасибо огромное! Буду учиться..

libusb0 не рекомендуется для новых проектов. libusbK или libusb1. Попробую вообще без них (только встроенный HiD Windows), но это когда ума наберусь.. не скоро :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

VaRek пишет:

libusb0 не рекомендуется для новых проектов. libusbK или libusb1. 

кем не рекомендуется?

VaRek
Offline
Зарегистрирован: 12.06.2017

Клапауций 112 пишет:

кем не рекомендуется?

 libusb.info

The current API is of 1.0 version (libusb-1.0 API).

legacy API (libusb-0.1 API) 

https://sourceforge.net/projects/libusb/files/

It is recommended new project should migrate to libusb-1.0 API and use libusb Windows (http://libusb.info) instead. For Windows only project, you can also look at libusbK below (http://libusbk.sourceforge.net/UsbK3/index.html)

Vitalii_PGUTI
Offline
Зарегистрирован: 16.04.2017

добрый день, а кто тут может написать скетч за небольшое вознаграждение? 

VaRek
Offline
Зарегистрирован: 12.06.2017

http://libusbk.sourceforge.net/UsbK3/usbk_comparisons.html

сравнение (преимущества и минусы)