前提・実現したいこと
普段C言語で、PICマイコンと戯れております。
AndroidもJavaも初挑戦で、
Android USBホスト機能を使ってシリアル通信しようとしたら、できませんでした。
発生している問題・エラーメッセージ
AndroidのUSBホスト機能でArduinoとシリアル通信する
を、丸写ししたつもりなのですが、通信できません。
(ビルドが通るところまでは自力でがんばりました)
具体的には、通信相手をつないでもusbがNULLのままです。
該当のソースコード
MainActivity.java
activity_main.xml
(文字数が...と出たので削除)
helloworld4/app/src/main/res/xml/device_filter.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<resources> 3 <!-- 0x067B / 0x2303: USB serial232c ok --> 4 <usb-device vendor-id="1659" product-id="8963" /> 5 6 <!-- 0x067B / 0x2303: USB serial232c --> 7 <usb-device vendor-id="1659" product-id="8963" /> 8 9 <!-- 0x0403 / 0x6001: FTDI FT232R UART --> 10 <usb-device vendor-id="1027" product-id="24577" /> 11 12 <!-- 0x0403 / 0x6015: FTDI FT231X ok --> 13 <usb-device vendor-id="1027" product-id="24597" /> 14 15 <!-- 0x2341 / Arduino --> 16 <usb-device vendor-id="9025" /> 17 18 <!-- 0x16C0 / 0x0483: Teensyduino --> 19 <usb-device vendor-id="5824" product-id="1155" /> 20 21 <!-- 0x10C4 / 0xEA60: CP210x UART Bridge --> 22 <usb-device vendor-id="4292" product-id="60000" /> 23 24 <!-- 0x067B / 0x2303: Prolific PL2303 --> 25 <usb-device vendor-id="1659" product-id="8963" /> 26 27 <!-- 0x1a86 / 0x7523: Qinheng CH340 --> 28 <usb-device vendor-id="6790" product-id="29987" /> 29</resources>
該当のソースコード(2019/05/29 17:00修正版)
MainActivity.java
java
1package xx.xx.xxxx.helloworld5; 2 3import android.content.Context; 4import android.support.v7.app.AppCompatActivity; 5import android.os.Bundle; 6import java.io.*; 7import android.hardware.usb.*; 8import android.util.Log; 9import android.widget.TextView; 10import com.hoho.android.usbserial.driver.*; 11 12public class MainActivity extends AppCompatActivity { 13 UsbSerialDriver usb; 14 int counter = 0; 15 int counter2 = 0; 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 22 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); 23 usb = UsbSerialProber.acquire(manager); 24 if (usb != null) { 25 try{ 26 usb.open(); 27 usb.setBaudRate(19200); 28 start_read_thread(); // シリアル通信を読むスレッドを起動 29 } 30 catch(IOException e){ 31 e.printStackTrace(); 32 } 33 counter++; 34 String str = String.valueOf(counter); 35 TextView my_counter = findViewById(R.id.counter_text); 36 my_counter.setText(str); 37 38 while(true) { 39 try { 40 usb.write("o".getBytes("UTF-8"), 1); 41 } catch (UnsupportedEncodingException e) { 42 // 発生し得ないが、書くしかない 43 // https://qiita.com/niharu/items/662b130149ee180f7f34 44 } catch (IOException e) { 45 e.printStackTrace(); 46 } 47 } 48 } else { 49 counter2++; 50 String str2 = String.valueOf(counter2); 51 TextView my_counter2 = findViewById(R.id.counter_text2); 52 my_counter2.setText(str2); 53 } 54 } 55 public void start_read_thread(){ 56 new Thread(new Runnable(){ 57 public void run(){ 58 try{ 59 while(true){ 60 byte buf[] = new byte[256]; 61 int num = usb.read(buf, buf.length); 62 if(num > 0) Log.v("Arduino", new String(buf, 0, num)); // Arduinoから受信した値をlogcat出力 63 Thread.sleep(10); 64 } 65 } 66 catch(IOException e){ 67 e.printStackTrace(); 68 } 69 catch (InterruptedException e) { 70 e.printStackTrace(); 71 } 72 } 73 }).start(); 74 } 75}
AndroidManifest.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="xx.xx.xxxx.helloworld5"> 4 <uses-feature android:name="android.hardware.usb.host" /> 5 <!-- https://blog.integrityworks.co.jp/2017/12/20/permission-is-only-granted-to-system-app/ --> 6 <uses-permission android:name="android.permission.MANAGE_USB" /> 7 <application 8 android:allowBackup="true" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/AppTheme"> 14 <activity android:name=".MainActivity"> 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 <action android:name="android.intent.action.VIEW"/> 18 19 <category android:name="android.intent.category.LAUNCHER" /> 20 </intent-filter> 21 <intent-filter> 22 <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 23 </intent-filter> 24 <meta-data 25 android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 26 android:resource="@xml/device_filter" /> 27 </activity> 28 </application> 29 30</manifest>
helloworld4/app/src/main/res/xml/device_filter.xml
は、そのままです。
試したこと
シリアルの端末がつながると、counter_textに1が入るはずなのに、
counter_text2に1が入る。
(古いソースでは、スイッチの反応がなくなるはずなのに、
ボタンをタップすると数値がインクリメントされる。)
補足情報(FW/ツールのバージョンなど)
シリアルの端末がつながると、ポップアップで許可を求めてきます。
API19
Android Studio 3.4です。
Q88というAndroid 4.4の実機で試しています。
#####ここにより詳細な情報を記載してください。
ライブラリーとして、
usb-serial-for-android-v010.jar(どこで拾ったのかわからなくなっている)
を取り込んでいます。
usb-serial-for-androidのグーグルコードが消えてしまって、情報が半分くらい
消え去っている。(githubに飛ばされた)
githubに公開されている、ライブラリのソースは読んでいない...です。すいません。
usb-serial-for-androidのgithub
次の2つのシリアル通信を試しました。
IOデータ USB-RSAQ6 usb-device vendor-id="1659" product-id="8963" 秋月電子通商のFT234X 超小型USBシリアル変換モジュール usb-device vendor-id="1027" product-id="24597"
Q88のadbがなくて、ちまちまリリース用のakpをファイル転送してテストしています。
よろしくお願いいたします。
追加情報
ソースコードをリンク先に近い形にしました。
通信相手をつないで『アプリの画面の R.id.button ボタンを
押しても』usbがNULLのまま, という解釈であっていますでしょうか.
はい。
なんのスイッチでしょう.
『アプリの画面の R.id.button ボタン』です。
どのような「許可」を求められるのでしょうか
Open アプリ名 when this USB device is connected?
□Use by default for this USB device
「Cancel」「 OK」
で、チェックマークを入れずにOKをタップした後、
ボタンの反応しますので、usbがnullと判断しています。
マニフェストに
<uses-permission android:name="android.permission.MANAGE_USB" />
を追記してみましたが、変わりませんでした。
AndroidのUSBホスト機能を緩く使ってみる
に従って、getDeviceListしてみました。
シリアル機器をUSBに接続すると
/dev/bus/001/026
と出ました。
送信ができました。(ご報告)(2019年6月中旬)
usb-serial-for-androidを使わない方法で、送信ができました。
AndroidのUSBホスト(OTG)機能を使って、接続されたArduinoとシリアル通信してみる話
を参考にしました。(ぐぐったり、null pointerに悩まされながら)
受信は、
自作のUSBデバイスを、Androidで動かす
を参考にやろうと思います。
両方できたら、「自己解決(いろいろお世話になっていますが...)」と
しようと思います。
よろしくお願いいたします。
受信ができませんでした。(ご報告)(2019July04)
いろいろ、インターネットをさまよったのですが、
serialドライバーを使わない方法での受信ができませんでした。
FTDI社のFT232RL用ドライバーを使ったら、FT234Xは通信ができた。(2019July04)
Fab蔵さんのページ:201. USB Host事前準備 から続く内容を実行したら動きました。
これをもって、自己解決としたいと思います。

回答4件
あなたの回答
tips
プレビュー