#USBシリアル通信
今回はAndroidを使ったUSBシリアル通信の方法を説明したいと思います。
サンプルとしてu-bloxを使用しています。
##FTDIとは
FTDIとは会社の名前でUSBとシリアルインタフェースの変換チップを作っているような会社です。
http://www.ftdichip.com/
Githubにライブラリが公開されていますので、cloneして、プロジェクトに追加してください
https://github.com/mik3y/usb-serial-for-android/tree/master/usbSerialForAndroid
##使い方
※前提としてServiceクラスを使って動かしてください。
初めにUsbManagerクラスのインスタンスを作成します。
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
次にUSBにはベンダーIDとプロダクトIDというものが設定されていますので、ProbeTableクラスに設定します。
参考までにu-bloxの情報は下記に載っています。
https://devicehunt.com/view/type/usb/vendor/1546/
ProbeTable customTable = new ProbeTable();
customTable.addProduct(0x1546, 0x01a7, CdcAcmSerialDriver.class);
mUsbSerialProber = new UsbSerialProber(customTable);
続いて設定したIDを元に全てのドライバーを取得し、Portリストを取得します。
mUsbSerialProber.findAllDrivers(mUsbManager);
for (final UsbSerialDriver driver : drivers) {
final List<UsbSerialPort> ports = driver.getPorts();
}
上記で取得したポートリストから1つ選んで、接続するポートを選び、各設定を加えます。
UsbDeviceConnection connection = mUsbManager.openDevice(sPort.getDriver().getDevice());
try {
sPort.open(connection);
sPort.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
} catch (IOException e) {
Log.e(TAG, "Error setting up device: " + e.getMessage(), e);
try {
sPort.close();
} catch (IOException e2) {
// Ignore.
}
sPort = null;
return Service.START_REDELIVER_INTENT;
}
setPrametersではビットレート、データビット、ストップビット、パリティビットが設定可能です。
次にシリアル通信で受け取るためにSerialInputOutputManagerを設定します。
mSerialIoManager = new SerialInputOutputManager(sPort, mListener);
mExecutor.submit(mSerialIoManager);
mListernerはこんな感じです
private final SerialInputOutputManager.Listener mListener =
new SerialInputOutputManager.Listener() {
@Override
public void onRunError(Exception e) {
Log.d(TAG, "Runner stopped.");
}
@Override
public void onNewData(final byte[] data) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < data.length - 2; i++) {
if (data[i] > ' ' && data[i] < '~') {
result.append(new String(new byte[]{data[i]}));
} else {
result.append(".");
}
}
String datas = new String(data, StandardCharsets.UTF_8);
Log.i(TAG, "reading GPS: " + datas );
}
};
上記の"reading GPS:" のところで実際のString型で取得している情報がlog出力されます。
#まとめ
今回はu-bloxのUSBで試してみましたが、他のUSBシリアル通信も基本的には
ベンダIDとプロダクトIDを変えるだけでできると思いますので、試してみてください。