Android 3.2 の USB ホスト機能を利用するプロジェクトに取り組んでいます。私は USB/シリアル通信全般に関する知識と才能の嘆かわしい不足に苦しんでいます。また、何をする必要があるかについての良いサンプルコードも見つかりません。
USB 通信デバイスから読み取る必要があります。
例: Putty 経由で (PC 上で) 接続する場合、次のように入力します。
>GO
そして、デバイスは私のためにデータを吐き出し始めます。ピッチ/ロール/温度/チェックサム。
元:
$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
Android デバイスから最初の「GO」コマンドを送信すると、「GO」のエコーが受信されます。
その後の読み取りでは他に何もありません。
方法: 1) 「go」コマンドを送信します。2) 結果として生じるデータのストリームを読み込みます。
私が使用している USB デバイスには、次のインターフェイス (エンドポイント) があります。
デバイス クラス: 通信デバイス (0x2)
インターフェース:
インターフェイス #0 クラス: 通信デバイス (0x2) エンドポイント #0 方向: インバウンド (0x80) タイプ: 割り込み (0x3) ポーリング間隔: 255 最大パケット サイズ: 32 属性: 000000011
インターフェイス #1 クラス: 通信デバイス クラス (CDC) (0xa) エンドポイント #0 アドレス: 129 番号: 1 方向: インバウンド (0x80) タイプ: バルク (0x2) ポーリング間隔 (0) 最大パケット サイズ: 32 属性: 000000010
エンドポイント #1 アドレス: 2 番号: 2 方向: アウトバウンド (0x0) タイプ: バルク (0x2) ポーリング間隔 (0) 最大パケット サイズ: 32 属性: 000000010
アクセス許可を処理し、デバイスに接続し、正しいインターフェイスを見つけて、エンドポイントを割り当てることができます。最初のコマンドを送信して後続のデータを読み取るために使用する手法を理解するのに苦労しています。bulkTransfer と controlTransfer のさまざまな組み合わせを試してみましたが、うまくいきませんでした。
ありがとう。
以下に示すように、interface#1 を使用しています。
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);
}