質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

Android USBホスト機能を使ってシリアル通信したい。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,833

murakami-kurio

score 15

前提・実現したいこと

普段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 version="1.0" encoding="utf-8"?>
<resources>
    <!-- 0x067B / 0x2303: USB serial232c ok -->
    <usb-device vendor-id="1659" product-id="8963" />

    <!-- 0x067B / 0x2303: USB serial232c -->
    <usb-device vendor-id="1659" product-id="8963" />

    <!-- 0x0403 / 0x6001: FTDI FT232R UART -->
    <usb-device vendor-id="1027" product-id="24577" />

    <!-- 0x0403 / 0x6015: FTDI FT231X ok -->
    <usb-device vendor-id="1027" product-id="24597" />

    <!-- 0x2341 / Arduino -->
    <usb-device vendor-id="9025" />

    <!-- 0x16C0 / 0x0483: Teensyduino  -->
    <usb-device vendor-id="5824" product-id="1155" />

    <!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
    <usb-device vendor-id="4292" product-id="60000" />

    <!-- 0x067B / 0x2303: Prolific PL2303 -->
    <usb-device vendor-id="1659" product-id="8963" />

    <!-- 0x1a86 / 0x7523: Qinheng CH340 -->
    <usb-device vendor-id="6790" product-id="29987" />
</resources>

該当のソースコード(2019/05/29 17:00修正版)

MainActivity.java

package xx.xx.xxxx.helloworld5;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.*;
import android.hardware.usb.*;
import android.util.Log;
import android.widget.TextView;
import com.hoho.android.usbserial.driver.*;

public class MainActivity extends AppCompatActivity {
    UsbSerialDriver usb;
    int counter = 0;
    int counter2 = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
        usb = UsbSerialProber.acquire(manager);
        if (usb != null) {
            try{
                usb.open();
                usb.setBaudRate(19200);
                start_read_thread(); // シリアル通信を読むスレッドを起動
            }
            catch(IOException e){
                e.printStackTrace();
            }
            counter++;
            String str = String.valueOf(counter);
            TextView my_counter = findViewById(R.id.counter_text);
            my_counter.setText(str);

            while(true) {
                try {
                    usb.write("o".getBytes("UTF-8"), 1);
                } catch (UnsupportedEncodingException e) {
                    // 発生し得ないが、書くしかない
                    // https://qiita.com/niharu/items/662b130149ee180f7f34
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            counter2++;
            String str2 = String.valueOf(counter2);
            TextView my_counter2 = findViewById(R.id.counter_text2);
            my_counter2.setText(str2);
        }
    }
    public void start_read_thread(){
        new Thread(new Runnable(){
            public void run(){
                try{
                    while(true){
                        byte buf[] = new byte[256];
                        int num = usb.read(buf, buf.length);
                        if(num > 0) Log.v("Arduino", new String(buf, 0, num)); // Arduinoから受信した値をlogcat出力
                        Thread.sleep(10);
                    }
                }
                catch(IOException e){
                    e.printStackTrace();
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xx.xx.xxxx.helloworld5">
    <uses-feature android:name="android.hardware.usb.host" />
    <!-- https://blog.integrityworks.co.jp/2017/12/20/permission-is-only-granted-to-system-app/ -->
    <uses-permission android:name="android.permission.MANAGE_USB" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
               <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            </intent-filter>
            <meta-data
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
        </activity>
    </application>

</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事前準備 から続く内容を実行したら動きました。
これをもって、自己解決としたいと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/05/29 11:18

    > 通信相手をつないでもusbがNULLのまま
    「通信相手をつないで」というイベントに対してアプリが何かするようなコードにはなっておりません.
    通信相手をつないで『アプリの画面の R.id.button ボタンを押しても』usbがNULLのまま, という解釈であっていますでしょうか.

    > シリアルの端末がつながると、スイッチの反応がなくなる
    なんのスイッチでしょう.

    > シリアルの端末がつながると、ポップアップで許可を求めてきます。
    どのような「許可」を求められるのでしょうか

    キャンセル

  • murakami-kurio

    2019/05/29 11:55

    いろいろすみません。
    >通信相手をつないで『アプリの画面の 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と判断しています。
    お手間を取らせて申し訳ありませんが、よろしくお願いいたします。

    キャンセル

回答 4

+2

ボタンを押す前に start_read_thread を含む if (usb != null) { } のブロックは実行されてしまっています.
このブロックを usb = UsbSerialProber.acquire(manager); の後に持っていく必要があるのではないでしょうか.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/06 09:36

    別質問、
    https://teratail.com/questions/193292
    別ユーザ様より、「プログラミングではない」旨、指摘をうけましたので、
    質問を取り下げました。

    指摘の内容、試してみたいと思います。

    キャンセル

  • 2019/06/06 09:41

    中古で、
    PICで楽しむAndroidアクセサリの自作
    https://www.amazon.co.jp/dp/4774150991/

    を注文しました。今晩届く予定です。

    キャンセル

  • 2019/06/07 13:47 編集

    上記の本は、USBのHIDクラスだけを使っている模様で、
    追記
    そんなことないか。HIDはキーボードのクラスだ。

    じゃあ、USBシリアル変換は何かと調べたら、

    https://www.a-poc.co.jp/howto/howto_usb_serial_com.html
    USBクラスはCommunication and CDC ControlおよびCDC-Data。(CDC=CommunicationDeviceClass)。

    とのことでした。残念。

    追記。
    CDC?について、触れられていないのはたしかです。

    追記2.
    UsbDeviceConnectionクラスの模様でした。すみません。

    キャンセル

+2

usb が常に null になっているのだと思います。

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
usb = UsbSerialProber.acquire(manager);

usb が正しく取得できているか Log.i("TAG", "usb:" + usb) 等で確認してみて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/04 11:10

    この件の、MainActivity.java を貼っておきます。
    package xx.xx.xxxx.helloworld9;

    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.hardware.usb.UsbDevice;
    import android.hardware.usb.UsbDeviceConnection;
    import android.hardware.usb.UsbManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;

    import com.hoho.android.usbserial.driver.UsbSerialDriver;
    import com.hoho.android.usbserial.driver.UsbSerialPort;
    import com.hoho.android.usbserial.driver.UsbSerialProber;

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    //import java.util.HashMap;
    //import java.util.Iterator;
    import java.util.List;

    public class MainActivity extends AppCompatActivity {
    //private HashMap<String, UsbDevice> deviceList;
    //private UsbDevice mUsbDevice;
    //private UsbManager my_manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Find all available drivers from attached devices.
    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    //my_manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
    if (availableDrivers.size() == 0) {
    //String s = "return20190606";
    return;
    } else {
    // String s = String.valueOf(availableDrivers.size());
    }
    //deviceList = my_manager.getDeviceList();
    //Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
    //while (deviceIterator.hasNext()) {
    // mUsbDevice = deviceIterator.next();
    //}

    if (manager.hasPermission(availableDrivers.get(0).getDevice())) {
    //許可した。コネクトするぞい
    } else {
    String s = "return20190607-2";
    TextView textView = findViewById(R.id.textView);
    textView.setText(s);
    }
    // Open a connection to the first available driver.
    UsbSerialDriver driver = availableDrivers.get(0);
    UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
    if (connection == null) {
    // You probably need to call UsbManager.requestPermission(driver.getDevice(), ..)
    // String s = "return20190607";
    return;
    }

    // Read some data! Most have just one port (port 0).
    UsbSerialPort port = driver.getPorts().get(0);
    try {
    port.open(connection);
    port.setParameters(19200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);

    try {
    String my_write = "s\n\r";
    port.write(my_write.getBytes("UTF-8"), my_write.length());
    } catch (UnsupportedEncodingException e) {
    // 発生し得ないが、書くしかない
    // https://qiita.com/niharu/items/662b130149ee180f7f34
    } catch (IOException e) {
    e.printStackTrace();
    }
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    byte buffer[] = new byte[16];
    int numBytesRead = port.read(buffer, 1000);
    Log.v( "Read ", numBytesRead + " bytes.");
    //String s = String.valueOf(numBytesRead);
    } catch (IOException e) {
    // Deal with error.
    } finally {
    try {
    port.close();
    } catch (IOException e) {
    // Deal with error.

    }
    }
    }
    }

    キャンセル

  • 2019/07/08 15:41

    「com.○○.○○○.USB_PERMISSION」 は、
    xx.xx.xxxx.helloworld9 ですか。
    すみません。
    やってみます。
    (今、
    https://developer.android.com/training/basics/firstapp/starting-activity.html?hl=JA
    を、つまずきながらやっている)

    キャンセル

  • 2019/07/19 15:44

    やってみたのですが、秘密key?のパスワードが消えてしまい、
    さらに、鍵を再設定したら、パスがおかしいよう
    (Android Studioを立ち上げたまま、プロジェクトの入ったフォルダーを
     コピーしようとしたのが原因らしい...MainActivity.javaの親戚みたいな
     ファイルが生成されていたりする)で、実機でテストできず、
    同じようにプロジェクトを新たに作り直したつもりなのですが、
    エラーが出てビルドが通らず...この件は検証なしでお願いしたく。

    (一応、エラーを書いておくと、
    ・java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
    ・com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
    ・com.android.tools.r8.CompilationFailedException: Compilation failed to complete
    ・com.android.tools.r8.utils.AbortException: Error: Program type already present: com.hoho.android.usbserial.BuildConfig
    の4つです)
    いろいろありがとうございました。
    よろしくお願いいたします。

    キャンセル

+1

ソースを見た感じだとポートの一覧の取得で失敗しているようです。
以下がチップを開発している会社だと思います。

UART Terminal Application
https://www.ftdichip.com/Android.htm

こちらのアプリで動作するか見て下さい。
動けば、ソースもあるので、流用できると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/13 11:42

    ご指摘ありがとうございます。
    <!-- 0x067B / 0x2303: USB serial232c ok -->
    <usb-device vendor-id="1659" product-id="8963" />
    <!-- 0x0403 / 0x6015: FTDI FT231X ok -->
    <usb-device vendor-id="1027" product-id="24597" />
    の記載がありました。
    AndroidManifest.xml で、device_filter.xml が
    <meta-data
    android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
    android:resource="@xml/device_filter" />
    と、指定されています。

    よろしくお願いいたします。

    キャンセル

  • 2019/06/13 11:46

    FTDI の サンプルプログラム、
    UART Terminal Application 16th July 2013
    のapkで、PICマイコンとの通信ができました。
    (タブレットQ88の問題ではなかった)
    ご報告まで。

    キャンセル

  • 2019/06/13 17:18

    「android.hardware.usb....を直接たたく方法」をやってみているのですが、
    スレッドを作ると、
    Unfortunately <application> has stopped が起きてしまいます。
    別質問として、
    https://teratail.com/questions/194793
    としました。
    よろしければあわせてご回答、お願いいたします。

    キャンセル

check解決した方法

0

Fab蔵さんの201. USB Host事前準備から始まるWebサイトを参考にさせていただき、
ほぼ、そのままで送受信ができました。

j2xxを使っています。

みなさま、いろいろありがとうございました。

追記(2019.Aug.29)

大量に(あるいは高速に)データを受け取ると、
Handlerまでデータが届かない、という症状が出ております。
readDataまで、データは来ているようなのですが...。
タイマーを追加し、マイコンの手法で読んでみたいと思います。

追記、ここまで。

追記(2019.July.25)

受信が安定しないようなので、次のように変えました。
オープン・リード・ライト・クローズで見るAndroid FTDI公式 ドライバ

ftDev.read(readData, iavailable);
// String mData = new String(readData);
// cannot use System.arraycopy
for(i=0; i<iavailable; i++) {
  readDataToText[i] = (char)readData[i];
}
Message msg = mHandler.obtainMessage();
// msg.obj = mData;
msg.obj = String.copyValueOf(readDataToText,0,iavailable);
mHandler.sendMessage(msg);


追記ここまで。

MainActivity.java

package xx.xx.xxxx.myusbhost;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.ftdi.j2xx.D2xxManager;
import com.ftdi.j2xx.FT_Device;

public class MainActivity extends AppCompatActivity {

    private FT_Device ftDev = null;
    private static Context mContext;
    private D2xxManager ftdid2xx;
    private static final String TAG = "USB";
    private boolean isReading = false;
    private ReadThread mReadThread;
    private int iavailable = 0;
    private static final int readLength = 512;
    byte[] readData;
    char[] readDataToText;
    private TextView mInputValue;
    private Button mOutputButton;
    int myCounter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            ftdid2xx = D2xxManager.getInstance(this);
        } catch (D2xxManager.D2xxException ex) {
            Log.e(TAG,ex.toString());
        }

        mContext = this.getBaseContext();

        openUsb();

        mInputValue = (TextView)findViewById(R.id.inputValue);

        // ボタンが押されたらUSBに値を送り込む
        mOutputButton = (Button)findViewById(R.id.outputButton);
        mOutputButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myCounter++;
                //String s = String.valueOf(myCounter);
                //s += "\r";
                String s = "s\r";
                SendMessage(s);
            }
        });
    }


    public void openUsb(){
        int devCount = 0;
        devCount = ftdid2xx.createDeviceInfoList(this);
        if (devCount <= 0)
        {
            Toast.makeText(this, "デバイスが発見できません。" + Integer.toString(devCount), Toast.LENGTH_LONG).show();
            Log.i(TAG,"デバイスが発見できましせんでした。");
            return;
        }
        else{
            Toast.makeText(this, "" + devCount + "個のデバイスを発見しました。", Toast.LENGTH_LONG).show();
            Log.i(TAG,"" + devCount + "個のデバイスを発見しました。");
        }

        if(null == ftDev)
        {
            ftDev = ftdid2xx.openByIndex(mContext, 0);
        }
        else
        {
            synchronized(ftDev)
            {
                ftDev = ftdid2xx.openByIndex(mContext, 0);
            }
        }
        //ftDev.setBitMode((byte) 0, D2xxManager.FT_BITMODE_RESET);
        ftDev.setBaudRate(19200);
        ftDev.setDataCharacteristics(D2xxManager.FT_DATA_BITS_8, D2xxManager.FT_STOP_BITS_1, D2xxManager.FT_PARITY_NONE);
        ftDev.setFlowControl(D2xxManager.FT_FLOW_NONE, (byte) 0x0b, (byte) 0x0d);
        ftDev.purge((byte) (D2xxManager.FT_PURGE_TX | D2xxManager.FT_PURGE_RX));
        ftDev.restartInTask();

        readData = new byte[readLength];
        readDataToText = new char[readLength];
        mReadThread = new ReadThread(mHandler);
        mReadThread.start();
        isReading = true;
    }

/* 20190703
*/
    public void SendMessage(String msg) {

        if(ftDev == null){
            return;
        }

        synchronized (ftDev) {
            if (ftDev.isOpen() == false) {
                Log.e("j2xx", "SendMessage: device not open");
                return;
            }

            ftDev.setLatencyTimer((byte) 16);

            if (msg != null) {
                byte[] OutData = msg.getBytes();
                ftDev.write(OutData, msg.length());
            }
        }
    }
    private class ReadThread  extends Thread
    {
        Handler mHandler;

        ReadThread(Handler h){
            mHandler = h;
            this.setPriority(Thread.MIN_PRIORITY);
        }

        @Override
        public void run()
        {
            int i;

            while(true == isReading)
            {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                }

                synchronized(ftDev)
                {
                    iavailable = ftDev.getQueueStatus();
                    if (iavailable > 0) {

                        if(iavailable > readLength){
                            iavailable = readLength;
                        }

                        ftDev.read(readData, iavailable);
                        String mData = new String(readData);
                        Message msg = mHandler.obtainMessage();
                        msg.obj = mData;
                        mHandler.sendMessage(msg);
                    }
                }
            }
        }

    }

    /**
     * 描画処理はHandlerでおこなう
     */
    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            String mData = (String)msg.obj;
            mInputValue.setText(mData);
        }
    };

    BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
                // never come here(when attached, go to onNewIntent)
                openUsb();
            } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                if(ftDev != null) {
                    ftDev.close();
                    isReading = false;
                }
            }
        }
    };
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <TextView
        android:id="@+id/inputValue"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="5dp"
        android:layout_marginTop="5dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintBottom_toTopOf="@+id/outputButton"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/outputButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginStart="100dp"
        android:layout_marginTop="200dp"
        android:layout_marginBottom="483dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/inputValue"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


</android.support.constraint.ConstraintLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xx.xx.xxxx.myusbhost">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW"/>

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>

<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />

</activity>
</application>

</manifest>

device_filter.xml
は、質問と同じ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/08 21:08

    お疲れ様でした(_ _

    キャンセル

  • 2019/07/09 09:42 編集

    いろいろありがとうございました。
    ...「Q」ではありません(^^;;

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る