現在、KotlinでスマートフォンをホストにしたUSB端末と接続して利用するアプリを開発しています。
その中でandroid.hardware.usb以下のライブラリを利用してバイト列をUSB端末に送受信する処理があるのですが、Kotlinではbyte型が-128~128の範囲で定義されていて255の0xffなどをbyteArrayの中に書いてもエラーが起きてbyteとして認識されません。
また、デバッグがPCと接続していないとできないため,実機とUSB端末とを接続している時に起きているエラーが見れないことにも困っています。
何か解決策・回答に不十分な点がありましたらお願いします。
以下コードです。(通信系の処理なので非同期で書いているつもりです)
epOut,epInはusbEndpoint型
mUsbDeviceはusbDevice型
connectionはUsbDeviceConnection型です。
kotlin
1fun communicateDevice() = GlobalScope.launch(Dispatchers.Main) { 2 val usbInterface = mUsbDevice!!.getInterface(0) 3 for (i in 0..usbInterface.endpointCount-1){ 4 val ep = usbInterface.getEndpoint(i) 5 if(ep.type == UsbConstants.USB_ENDPOINT_XFER_INT){ 6 if(ep.direction == UsbConstants.USB_DIR_IN){ 7 epIn = ep 8 }else if(ep.type == UsbConstants.USB_DIR_OUT){ 9 epOut = ep 10 } 11 } 12 } 13 connection.claimInterface(usbInterface,true) 14 launch { 15 async(Dispatchers.Default) { 16 //0xffをそのまま書くとエラーが出るのでtoByte()変換するが-1が返される。 17 doRequest(byteArrayOf(0x00, 0x00, 0xff.toByte(), 0x00, 0xff.toByte(), 0x00)) 18 //実際はこの後送受信のコードがまだ続いています。 19 }.await() 20 } 21} 22 23@Throws(IOException::class) 24private fun doRequest(buff: ByteArray) { 25 println("request") 26 val buffer = ByteBuffer.allocate(buff.size) 27 val request = UsbRequest() 28 buffer.put(buff) 29 30 request.initialize(connection, epOut) 31 request.queue(buffer, buff.size) 32 33 var finishReq: UsbRequest? 34 do { 35 finishReq = connection.requestWait() 36 if(finishReq == request){ 37 break 38 } 39 if (finishReq == null) throw IOException("Request failed.") 40 sleep(100) 41 }while(true) 42} 43 44 45@Throws(IOException::class) 46private fun doResponse(): ByteArray { 47 println("response") 48 val buffer = ByteBuffer.allocate(epIn.getMaxPacketSize()) 49 buffer.clear() 50 val request = UsbRequest() 51 request.initialize(connection, epIn) 52 request.queue(buffer, epIn.getMaxPacketSize()) 53 var finishReq: UsbRequest? 54 do { 55 finishReq = connection.requestWait() 56 if(finishReq == request){ 57 break 58 } 59 if (finishReq == null) throw IOException("Request failed.") 60 sleep(100) 61 }while(true) 62 if (buffer.remaining() == 0) buffer.flip() 63 val buff = ByteArray(buffer.remaining()) 64 buffer.get(buff) 65 return buff 66}
回答1件
あなたの回答
tips
プレビュー