LoginSignup
9
15

More than 3 years have passed since last update.

Android USBシリアル通信方法

Posted at

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を変えるだけでできると思いますので、試してみてください。

9
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
15