Androidとシリアル通信をしたいのですが、どうしたらよいでしょうか?

3,583 views
Skip to first unread message

Ryouhei Tomo

unread,
Jun 12, 2014, 6:07:12 AM6/12/14
to android-g...@googlegroups.com
Androidでシリアル通信をしたいのですが、FTDIが認識しない場合があるようです。ドライバーをカーネルに組み込んでいない場合でも可能な方法があれば教えてほしいです。

Keisuke SUZUKI

unread,
Jun 12, 2014, 9:44:54 AM6/12/14
to android-g...@googlegroups.com

鈴木です。

Android 3.1以上のフレームワークでUSB Host APIがサポートされており、このAPIを使ってJavaでUSBシリアル通信のドライバを実現しているプロジェクトがいくつかあります。
これらは個々のアプリにライブラリとして組み込むことでシリアル通信させることができます。

・FTDI公式ドライバ d2xx.jar
http://www.ftdichip.com/Android.htm
対応プロトコル
-FTDIのみ

・Physicaloid Library
https://github.com/ksksue/PhysicaloidLibrary
対応プロトコル
-FTDI全般
-CDC ACM
-CP210x

・usb-serial-for-android
https://github.com/mik3y/usb-serial-for-android
対応プロトコル
-FT232R
-CDC/ACM serial services
-CP2102

注意点としては、Android 3.1以上であればUSB Host APIが搭載されているはずなのですが
ベンダーによっては不要と判断されてか搭載されていない端末があります。これらは上記ライブラリは使えません。
中華パッドに多いようです。それ以外で言うとNexus 4にもありません。

以上

Androidでシリアル通信をしたいのですが、FTDIが認識しない場合があるようです。ドライバーをカーネルに組み込んでいない場合でも可能な方法があれば教えてほしいです。

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

大和田健一

unread,
Jun 12, 2014, 4:05:05 PM6/12/14
to 日本Androidの会
PhysicaloidLibrary お世話になってます。

ところで、mbed の場合は、うまくいきません。
理由はこちらに。

---
大和田健一 <ml.o...@gmail.com>

Ryouhei Tomo

unread,
Jun 12, 2014, 4:56:29 PM6/12/14
to android-g...@googlegroups.com
回答いただきありがとうございました!
使用している端末が、ICOOのD70WとD70GNいう中華パッドなのでうまくいかないのかもしれません。

2台端末があってAndroid のバージョンは、4.0と4.2です。
更にお伺いできればと思うのですが、USB Host APIが搭載されているかいないかを調べる方法はありますでしょうか?



Keisuke SUZUKI

unread,
Jun 12, 2014, 6:56:24 PM6/12/14
to android-g...@googlegroups.com
鈴木です。

Ryouhei さん
> USB Host APIが搭載されているかいないかを調べる方法はありますでしょうか?

以下の3つの方法があります。2が最も確実ですが、1でまず簡単にチェックができます。


1. USB Host API対応アプリがGooglePlayからインストールできるか?
そもそも端末がUSB Host API対応していない場合、Google Play上にUSB Host API対応アプリが表示されなくなります。
例えば以下のアプリをAndroid端末上で検索してみて見つからなければ USB Host API対応ではないといえます。
https://play.google.com/store/apps/details?id=jp.ksksue.app.terminal


2. 対象とするデバイスを直接差し込み、対応アプリが起動するか?
この方法が一番確実です。FTDIであれば上記アプリをインストールして
直接USB接続させてみてください。アプリが自動起動すればUSB Host API対応しています。

ちなみによくある勘違いなのですが、
マウス、キーボード(HIDクラス)やUSBメモリ(マスストレージクラス)を差し込み
認識されるからといってUSB Host API対応しているわけではないという点に注意してください。
HIDクラス、マスストレージクラスはカーネルレベルで実装されており
USB Host API対応・非対応にかかわらず認識される場合があります。
例えば、これらクラスはUSB Host API対応以前のAndroid 2.x系の端末でも認識されたりします。


3. USB Host Checkアプリを使う
一応USB Host Checkというアプリがあります。ただし残念ながら判定はあまり正確ではなく
USB Host APIが使えても「使えない」と判定される場合があります。
なぜ使えないのかという原因を明らかにするには良いツールかもしれません。
https://play.google.com/store/apps/details?id=org.tauruslabs.usbhostcheck



大和田 さん
> ところで、mbed の場合は、うまくいきません。
ご報告ありがとうございます。
たしか3/1の更新時にmbedの通信問題対応済です。
ご指摘の通りcontrolTransferのindexを0固定していたためで、
CDC-ACMクラスを検索しそのinterface番号をindex番号とするよう変更しました。

以上

2014年6月13日 5:56 Ryouhei Tomo <tomor...@gmail.com>:

大和田健一

unread,
Jun 12, 2014, 10:09:54 PM6/12/14
to 日本Androidの会
> mbedの通信問題対応済です。

対応済でしたか。
失礼しました。
今度 試してみます。

---
大和田健一 <ml.o...@gmail.com>

Ryouhei Tomo

unread,
Jun 12, 2014, 10:45:37 PM6/12/14
to android-g...@googlegroups.com
鈴木さん、ありがとうございました。

Android USB Serial Monitor Liteを、インストールして試してみました。

Nexus7 → ソフトの起動はOK,Connectもできているようだが、シリアルデータを送っても、文字が表示されない。
D70GN(中華パッド) → ソフトの起動はOKだが、Open Deviceしても、cannnotOpenとしか出ない。また、Writeができるモードに変わらない。

また、途中でUSBコネクタを抜き差しすると、問題が発生しましたエラーが出て途中終了してしまう。
シリアルデータが送られていることは、PCにUSBケーブルをつないで、RS-232Cモニタを開くと文字が表示されることで確認済です。


Ryouhei Tomo

unread,
Jun 12, 2014, 10:49:52 PM6/12/14
to android-g...@googlegroups.com
また、ちなみに、USB Host Viewerでは、Nexus7、D70GNとも、FT232 USB Serial(UARTC)ICと表示されました。
しかし、D70WはNot Found devicesとしか表示されませんでした。
以上から、Nexus7とD70GNについては、USB HOST APIを搭載しているが、D70Wは搭載していないという認識でいますが、正しいでしょうか?


Keisuke SUZUKI

unread,
Jun 14, 2014, 11:19:22 AM6/14/14
to android-g...@googlegroups.com

鈴木です。

そうですね。残念ながらD70GNには搭載されていないと思います。
USB Host Viewerで調べられたのはよい判断だと思います。

以上

2014/06/13 11:50 "Ryouhei Tomo" <tomor...@gmail.com>:
また、ちなみに、USB Host Viewerでは、Nexus7、D70GNとも、FT232 USB Serial(UARTC)ICと表示されました。
しかし、D70WはNot Found devicesとしか表示されませんでした。
以上から、Nexus7とD70GNについては、USB HOST APIを搭載しているが、D70Wは搭載していないという認識でいますが、正しいでしょうか?


Katsumi ISHIDA

unread,
Jun 14, 2014, 11:56:25 AM6/14/14
to android-g...@googlegroups.com
石田です。

Nexus7については3種類あって
Nexus7 (2012) USB hostあり
Nexus7 (2013) USB host あり
Nexus7 (2012版の廉価版)USB hostなし
のようになっていると思います。
お手持ちのNexus7は2012廉価版と思われます。




2014年6月15日 0:18 Keisuke SUZUKI <ksk...@gmail.com>:

Ryouhei Tomo

unread,
Jun 14, 2014, 6:39:09 PM6/14/14
to android-g...@googlegroups.com
鈴木さん、石田さん、ありがとうございました。

あれから、勉強して、鈴木さんの作られたPhysicaloidを試しています。
USB HOST APIで、FTDIを認識したD70GNを使って試していますが、最初のOpenのところで、UartFtdiクラスを呼び出しているところで、ClassNotFoundExceptionエラーが出てしまっています。

原因がわかりますでしょうか?



2014年6月12日木曜日 19時07分12秒 UTC+9 Ryouhei Tomo:
Androidでシリアル通信をしたいのですが、FTDIが認識しない場合があるようです。ドライバーをカーネルに組み込んでいない場合でも可能な方法があれば教えてほしいです。

Keisuke SUZUKI

unread,
Jun 14, 2014, 9:25:07 PM6/14/14
to android-g...@googlegroups.com
鈴木です。

石田さん
Nexus 7 廉価版 があるとは知りませんでした。見分け方というのはあるのでしょうか?


Ryouheiさん
プロジェクトのlibsディレクトリにd2xx.jarファイルは入っていますか?
Physicaloidライブラリは内部でFTDI公式のd2xx.jarを使っており、
UartFtdiクラスの参照先がd2xx.jarになっています。
おそらくd2xx.jarファイルがないためClassNotFoundExceptionエラーとなっていると考えられます。

前々回のメールの内容を見落としていましたが、
Nexus 7で通信ができないというのは、
単純にボーレートなどの通信設定が原因ということはないでしょうか?
Nexus 7で通信できなかったという報告は受けたことはなく、
そもそもボクの手元の動作確認環境がNexus 7なのでアプリに原因があるとは考えにくいです。
回路側は問題ないとのことなので、あとは通信設定が原因だと思います。


また余計なお世話かもしれませんが、
Ryouheiさんの質問は非常に情報が少なく、
今はライブラリの作者が回答しているためある程度は情報が補完されていますが、
そうでない人からこの質問でドンピシャの回答が得られたら
画面の先の相手は悟りを開いた人物か、水をぶどう酒に変えただれかさんだかと思います。

例えば、エラーメッセージはコピペしたほうがいいと思います。
FTDIのチップもしくはパッケージの型番といった基本情報は
そもそもの誤解を避ける情報になり得るかもしれません。
月並みですがこのあたりの話は以下の文書にまとめられています。

技術系メーリングリストで質問するときのパターン・ランゲージ
http://www.hyuki.com/writing/techask.html

この文書の内容が絶対のルールだとは思っていませんし、
ボクとしては質の良い情報共有を楽しむための知恵ぐらいに捉えていますので
ぜひともご協力を。

以上


2014年6月15日 7:39 Ryouhei Tomo <tomor...@gmail.com>:

Ryouhei Tomo

unread,
Jun 14, 2014, 11:25:08 PM6/14/14
to android-g...@googlegroups.com
鈴木さん、ありがとうございます。



Ryouheiさん
プロジェクトのlibsディレクトリにd2xx.jarファイルは入っていますか?
Physicaloidライブラリは内部でFTDI公式のd2xx.jarを使っており、
UartFtdiクラスの参照先がd2xx.jarになっています。
おそらくd2xx.jarファイルがないためClassNotFoundExceptionエラーとなっていると考えられます。


はい、入っています。
この、d2xx.jarドライバが正常に働いていないのでは?と疑っていろいろと調べてみました。

FTDIドライバーのサンプルソフトである、D2XXSampleをダウンロードしてD70GNで動かしてみたところ、こちらでは、LogCat上で次のメッセージが出て終了してしまいました。

06-15 09:19:49.927: I/System.out(1894): Sending WAIT chunk
06-15 09:19:49.927: W/ActivityThread(1894): Application com.ftdi.d2xx is waiting for the debugger on port 8100...
06-15 09:19:49.947: I/dalvikvm(1894): Debugger is active
06-15 09:19:50.127: I/System.out(1894): Debugger has connected
06-15 09:19:50.127: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:50.327: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:50.527: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:50.727: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:50.927: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:51.137: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:51.337: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:51.537: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:51.737: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:51.937: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:52.137: I/System.out(1894): waiting for debugger to settle...
06-15 09:19:52.337: I/System.out(1894): debugger has settled (1467)
06-15 09:19:52.547: I/ftd2xx-java(1894): loading JNI library...
06-15 09:19:52.547: D/dalvikvm(1894): Trying to load lib /data/data/com.ftdi.d2xx/libftd2xx-jni.so 0x41b4ed30
06-15 09:19:52.557: D/dalvikvm(1894): Added shared lib /data/data/com.ftdi.d2xx/libftd2xx-jni.so 0x41b4ed30
06-15 09:19:52.557: I/ftd2xx-java(1894): JNI library loaded!
06-15 09:19:55.587: A/libc(1894): @@@ ABORTING: LIBC: ARGUMENT IS INVALID HEAP ADDRESS IN dlfree addr=0x5adbc808
06-15 09:19:55.587: A/libc(1894): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1894 (com.ftdi.d2xx)


下の2行に原因がありそうです。対処方法まではわかりませんが。
06-15 09:19:55.587: A/libc(1894): @@@ ABORTING: LIBC: ARGUMENT IS INVALID HEAP ADDRESS IN dlfree addr=0x5adbc808
06-15 09:19:55.587: A/libc(1894): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1894 (com.ftdi.d2xx)


 
前々回のメールの内容を見落としていましたが、
Nexus 7で通信ができないというのは、
単純にボーレートなどの通信設定が原因ということはないでしょうか?
Nexus 7で通信できなかったという報告は受けたことはなく、
そもそもボクの手元の動作確認環境がNexus 7なのでアプリに原因があるとは考えにくいです。
回路側は問題ないとのことなので、あとは通信設定が原因だと思います。


Nexus7では、無事動作しました。ただし、ターゲットマシンがD70GNなので、Nexus7での動作が=問題解決にならないところが困っています。


また余計なお世話かもしれませんが、
Ryouheiさんの質問は非常に情報が少なく、
今はライブラリの作者が回答しているためある程度は情報が補完されていますが、
そうでない人からこの質問でドンピシャの回答が得られたら
画面の先の相手は悟りを開いた人物か、水をぶどう酒に変えただれかさんだかと思います。

例えば、エラーメッセージはコピペしたほうがいいと思います。
FTDIのチップもしくはパッケージの型番といった基本情報は
そもそもの誤解を避ける情報になり得るかもしれません。
月並みですがこのあたりの話は以下の文書にまとめられています。

技術系メーリングリストで質問するときのパターン・ランゲージ
http://www.hyuki.com/writing/techask.html

この文書の内容が絶対のルールだとは思っていませんし、
ボクとしては質の良い情報共有を楽しむための知恵ぐらいに捉えていますので
ぜひともご協力を。

以上


質問の仕方がなっていないというご指摘については、本当にすみません。
慣れてないというか、何を伝えれば良いのかもよくわからないままに、質問していまいました。



 

2014年6月15日 7:39 Ryouhei Tomo <tomor...@gmail.com>:
鈴木さん、石田さん、ありがとうございました。

あれから、勉強して、鈴木さんの作られたPhysicaloidを試しています。
USB HOST APIで、FTDIを認識したD70GNを使って試していますが、最初のOpenのところで、UartFtdiクラスを呼び出しているところで、ClassNotFoundExceptionエラーが出てしまっています。

原因がわかりますでしょうか?



2014年6月12日木曜日 19時07分12秒 UTC+9 Ryouhei Tomo:
Androidでシリアル通信をしたいのですが、FTDIが認識しない場合があるようです。ドライバーをカーネルに組み込んでいない場合でも可能な方法があれば教えてほしいです。

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsub...@googlegroups.com にメールを送信してください。

Keisuke SUZUKI

unread,
Jun 15, 2014, 12:14:52 AM6/15/14
to android-g...@googlegroups.com
鈴木です。

D2XXSampleをNexus 7で動作させて同じエラーがでますか?
もしエラーがでなければ D70GN の内部に原因がある可能性が高いです。

また、PhysicaloidLibraryをNexus7で使った場合、
D70GN と同じClassNotFoundExceptionエラーがでますか?

ところで
Nexus7では、無事動作しました。
というのは何が原因だったのでしょうか?

以上


2014年6月15日 12:25 Ryouhei Tomo <tomor...@gmail.com>:
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。

Ryouhei Tomo

unread,
Jun 16, 2014, 6:20:20 PM6/16/14
to android-g...@googlegroups.com
鈴木さん、回答をいただきありがとうございます。
あの後、別の端末を買いに行って更に追加して調べました。


Nexus7で、Android Serial Monitor Lite を操作させたときですが、送信元から、9600bpsで2秒毎に、56byteづつデータを送信させたところ、Android USB Serial Monitor Liteでは、56byte のうちの4byteしか受信データが表示されませんでした。あとのデータは表示そのものが欠落していました。
別の端末で操作させたところ、(Nexus7よりもスペックは劣りますが)正常に動きました。

ちなみに、Nexus7は今年の正月に購入したもので、Android Version は、4.4.3でした。
今も症状は変わっていないので、正常動作したとは言えないかもしれません。
ビットレートを落とすなどは試していません。

もう少し自分で調べてみることにします。


2014年6月15日日曜日 13時14分52秒 UTC+9 Keisuke SUZUKI:
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsubscribe...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages