Обнаружение, если устройство использует USB 3.0

Кто-нибудь знает, как определить, подключено ли устройство USB, подключенное к хост-порту USB 3.0, на 3.0 или 2.0 с помощью С#?

Мы производим кабели расширения USB 3.0, и нам нужно проверить, что все штыри были спаяны правильно. Мы хотели бы сделать это в программном обеспечении. Мы хотели бы подключить флэш-накопитель 3.0 к кабелю и проверить, работает ли устройство в режиме USB 3.0. Если он находится в режиме 2.0, мы знаем, что это проблема с 1 или более линиями USB 3.0.

Ответ 1

Мне удалось подготовить рабочую демонстрацию с помощью некоторого исходного кода < found.

private static void Main(string[] args)
{
  var hostCtrls = USB.GetHostControllers();

  foreach (var hostCtrl in hostCtrls)
  {
    var hub = hostCtrl.GetRootHub();
    foreach (var port in hub.GetPorts())
    {
      if (port.IsDeviceConnected && !port.IsHub)
      {
        var device = port.GetDevice();
        Console.WriteLine("Serial: " + device.DeviceSerialNumber);
        Console.WriteLine("Speed:  " + port.Speed);
        Console.WriteLine("Port:   " + device.PortNumber + Environment.NewLine);
      }
    }
  }
}

enter image description here

Приложение перечисляет хост-контроллеры USB. Затем он получает корневой концентратор и перечисляет принадлежащие ему порты. Если подключено устройство, и оно не является концентратором, тогда оно отображает требуемую информацию.

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

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

Что-то вроде:

GetDeviceSpeed(string hubPath, int portNumber) { ... }

и вызовите его с соответствующими значениями:

var hubPath = @"\\.\NUSB3#ROOT_HUB30#5&b235176&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}";
var portNumber = 2;
GetDeviceSpeed(hubPath, portNumber);

Если вы, однако, не хотите этого делать, вы можете просто использовать приведенный выше код и уведомить серийный номер устройства, которое хотите проверить, и только проверить скорость:

if (device.DeviceSerialNumber == "xxxxxx")
  Console.WriteLine("Speed:  " + port.Speed);

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

Ну... Есть мысли и, надеюсь, рабочее решение.