Pracuję nad projektem, który wykorzystuje możliwości hosta USB w systemie Android 3.2. Cierpię na opłakany brak wiedzy i talentu w zakresie komunikacji USB/szeregowej w ogóle. Nie mogę też znaleźć żadnego dobrego kodu przykładowego do tego, co muszę zrobić.Android Host Host Communication
Potrzebuję czytać z urządzenia komunikacyjnego USB.
Ex: Po podłączeniu poprzez Putty (na moim komputerze) wejdę:
>GO
i urządzenie zacznie wypluwać dane dla mnie. Pitch/Roll/Temp/Checksum.
Ex:
$R1.217P-0.986T26.3*60
$R1.217P-0.986T26.3*60
$R1.217P-0.987T26.3*61
$R1.217P-0.986T26.3*60
$R1.217P-0.985T26.3*63
mogę wysłać początkową polecenie 'Go' z urządzenia z systemem Android, w którym razem otrzymać echo 'Go'.
Nic innego w przypadku późniejszych odczytów.
Jak mogę: 1) Wyślij polecenie "idź". 2) Odczytuj w strumieniu danych, które wynikają.
Urządzenie USB, z którym pracuję, ma następujące interfejsy (punkty końcowe).
Device Class: Urządzenie do komunikacji (0x2)
Interfejsy:
Interfejs # 0 Klasa: Communication Device (0x2) Endpoint # 0 Kierunek: Inbound (0x80) Typ: Intrrupt (0x3) Poll Interval: 255 Max Packet Size: 32 Atrybuty: 000000011
Interfejs nr 1 Klasa: Komunikacja De wice Class (CDC) (0xa) Endpoint # 0 Adres: 129 Numer: 1 Kierunek: Inbound (0x80) Rodzaj: Bulk (0x2) Poll Interval (0) Max Packet Size: 32 Atrybuty: 000000010
Endpoint # 1 Adres: 2 Numer: 2 Kierunek: Wychodzące (0x0) Typ: Bulk (0x2) Poll Interval (0) Max Packet Size: 32 Atrybuty: 000000010
Jestem w stanie poradzić sobie z uprawnieniami, połączyć się z urządzeniem, znaleźć właściwy interfejs i przypisać punkty końcowe. Mam problem z ustaleniem, którą technikę użyć, by wysłać początkowe polecenie, odczytać wynikające z tego dane. Próbowałem różnych kombinacji bulkTransfer i controlTransfer bez powodzenia.
Dzięki.
Używam interfejsu nr 1, jak widać poniżej:
public AcmDevice(UsbDeviceConnection usbDeviceConnection, UsbInterface usbInterface) {
Preconditions.checkState(usbDeviceConnection.claimInterface(usbInterface, true));
this.usbDeviceConnection = usbDeviceConnection;
UsbEndpoint epOut = null;
UsbEndpoint epIn = null;
// look for our bulk endpoints
for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
UsbEndpoint ep = usbInterface.getEndpoint(i);
Log.d(TAG, "EP " + i + ": " + ep.getType());
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
epOut = ep;
} else if (ep.getDirection() == UsbConstants.USB_DIR_IN) {
epIn = ep;
}
}
}
if (epOut == null || epIn == null) {
throw new IllegalArgumentException("Not all endpoints found.");
}
AcmReader acmReader = new AcmReader(usbDeviceConnection, epIn);
AcmWriter acmWriter = new AcmWriter(usbDeviceConnection, epOut);
reader = new BufferedReader(acmReader);
writer = new BufferedWriter(acmWriter);
}
dla tych z nas zmaga się tam, w jaki sposób wybraliście Interfejs 1, i do jakich celów będzie Interfejs 0, interfejs przerwania być używane? Dzięki! – Rachael