2022年2月5日土曜日

【Android USB oscilloscope】(11) KotlinでSerial USB COMを動かしてみる

余っているAndroidスマホをオシロにしよう!

オシロとは直接の関係はないけど、Android StudioとJAVAの勉強のため、usb-serial-for-androidを読んでUSB COMのドライバがどんな動作しているのかを調べているところです.

ThreadやHandlerがわからなかったので、USB COMから受信したデータを画面に表示させるところで足踏みしていましたが解決しました.

project folder詰め合わせをupしときます.kotlin03_USB_recieve.zip
エラー処理やclose処理をなにもやってませんのであしからず.

アプリの動作は、OTGケーブルでArduinoを接続するとUSB関連情報を表示するとともに、末尾の行に受信データを表示します.Arduino側は1秒ごとに「serial send test xx xxh」という文字列を発信するように作ってあるとしてのハナシです.

source codeはMainActivity.ktです.あと、activity_main.xmlはTextViewを配置してあります.主なところだけ説明しますので詳細はAndroid Studioでご覧ください.

いつもおなじみonCreate()でいろいろやってます.
override fun onCreate(savedInstanceState: Bundle?) {

受信threadの設定について.
SerialInputOutputManagerの中にListnerというクラスがあり、USB COMから受信したらListenerの中のonNowData()がcallされるようになっています.ここではonNowDataを定義するのが仕事です.
① SerialInputOutputManager の中にあるListenerをここで定義する
② USB COMから受信するとonNewDataがcallされる
③ IDtxt9に受信内容を表示したいのだがonNewDataはIDtxt9を知らない
④ なのでThreadを建てて ⑤postして ⑥IDtxt9に表示してもらう
        val handler = Handler()
        lsn = object : SerialInputOutputManager.Listener { //①
            override fun onNewData(data : ByteArray){  //②③
                Thread { //④
                    handler.post {  //⑤
                        IDtxt9.text = "recieved data= "+data.decodeToString() //⑥
                    }
                }.start()
            }  }  }

もうひとつの山場は、USB COM deviceが接続された時にdriverを探したりopenしたりする処理をやります.onNewIntent()でやります.
    // USB deviceが接続されたらやる処理
    override fun onNewIntent(intent : Intent) {
        if ("android.hardware.usb.action.USB_DEVICE_ATTACHED" == intent.action) {
            IDtxt2.text = "attached USB COM"

            // USB COM driverをVID/PIDから検索する
            // 利用可能なdriverのListから0番目を採用する
            val manager = getSystemService(Context.USB_SERVICE) as UsbManager
            val availableDrivers: List<UsbSerialDriver> =
                UsbSerialProber.getDefaultProber().findAllDrivers(manager)
            val usbserialdriver : UsbSerialDriver = availableDrivers.get(0)

            // USB COMのopen処理
            connection = manager.openDevice(usbserialdriver.getDevice())
            port = usbserialdriver.getPorts().get(0)
            port.open(connection)
            port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE)

            // 受信処理の詳細はSerialInputOutputManagerにお任せ
            // lsn:Listenerが上で定義したonNewData()を含んでいる
            val iomanager = SerialInputOutputManager(port,lsn)
            iomanager.start()

チャラっとした説明は以上です.usb-serial-for-androidのdriverはこんな風に使うように出来ているというわけでした.

こんなところでusb-serial-for-androidからは撤退しようかな.javaとkotlinのお勉強は少し捗りました.

10へ             12へ

かしこ

0 件のコメント:

コメントを投稿