Как определить адрес конечной точки в «Последовательный порт USB на 4 порта»? - PullRequest
0 голосов
/ 27 июня 2018

Я программирую с Android Studio для цели Android Things на плате разработки Pico i.MX7Dual. У меня есть USB-последовательный преобразователь («USB в 4-Port Serial»), и я хочу общаться с каждым из последовательных портов. Я попытался использовать USB Host API для отображения списка устройств:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while(deviceIterator.hasNext()){
    UsbDevice device = deviceIterator.next();
    Log.d("USBList",device.toString());
}

И я получаю это в Logcat:

D/USBList: UsbDevice[mName=/dev/bus/usb/001/005,mVendorId=38672,mProductId=30784,mClass=255,mSubclass=0,mProtocol=255,mManufacturerName=null,mProductName=null,mVersion=2.0,mSerialNumber=null,mConfigurations=[
UsbConfiguration[mId=1,mName=null,mAttributes=160,mMaxPower=50,mInterfaces=[
UsbInterface[mId=0,mAlternateSetting=0,mName=null,mClass=255,mSubclass=0,mProtocol=255,mEndpoints=[
UsbEndpoint[mAddress=129,mAttributes=2,mMaxPacketSize=512,mInterval=255]
UsbEndpoint[mAddress=2,mAttributes=2,mMaxPacketSize=512,mInterval=255]
UsbEndpoint[mAddress=131,mAttributes=2,mMaxPacketSize=512,mInterval=255]
UsbEndpoint[mAddress=4,mAttributes=2,mMaxPacketSize=512,mInterval=255]
UsbEndpoint[mAddress=133,mAttributes=2,mMaxPacketSize=512,mInterval=255]
UsbEndpoint[mAddress=6,mAttributes=2,mMaxPacketSize=512,mInterval=255]
UsbEndpoint[mAddress=135,mAttributes=2,mMaxPacketSize=512,mInterval=255]
UsbEndpoint[mAddress=8,mAttributes=2,mMaxPacketSize=512,mInterval=255]
UsbEndpoint[mAddress=137,mAttributes=3,mMaxPacketSize=16,mInterval=5]]]]

Если я понимаю, мне нужно связаться с UsbEndpoint через UsbInterface, но у меня только 4 последовательных порта, но я получаю 9 UsbEndpoints.

Так что я не знаю, что делать дальше, чтобы определить хороший UsbEndPoint для связи с ним.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 июня 2018

Большинство USB-последовательных преобразователей поддерживаются API-интерфейсом ввода-вывода Android Things, поэтому первое, что я бы порекомендовал вам проверить, это то, отображается ли ваш преобразователь как UartDevice в списке периферийных устройств:

PeripheralManager.getInstance().getUartDeviceList()

Устройства обычно работают с именем типа USB1-1:1.0.

Если ваше устройство не поддерживается этой подсистемой, возможно, вам придется углубиться в API-интерфейсы USB. Давайте расшифруем вывод вашего дескриптора конечной точки. Ваше устройство имеет 8 конечных точек типа «Bulk» (mAttributes=2) и одну из типов прерывания (mAttributes=3). Конечные точки группирования сопряжены для каждого последовательного канала (одна для входа, одна для выхода). Вам нужно будет прочитать значение направления каждой конечной точки, чтобы знать наверняка (не печатается в журнале). Порядок, в котором они перечислены, наиболее вероятно указывает на спаривание для каждого канала.

Затем вам нужно будет связаться с производителем вашего устройства USB и найти таблицу данных, в которой описан протокол, который они используют для передачи данных. Все классы устройств / интерфейсов 0xFF (255), что означает «зависящий от поставщика». По сути, это означает, что они не соответствуют стандартному классу USB-устройств и им необходимо предоставить документацию по протоколу.

...