Android原生通过JSSC和NDK使用USB OTG模式访问tty串口

问题描述

我正在尝试通过 NDK 使用 JSSC 在 Android 上打开串行端口。

幸运的是我编译了 JSSC,但我遇到的问题与权限相关:

jssc.SerialPortException: Port name - /dev/bus/usb/001/002; Method name - openPort(); Exception type - Permission denied.
    at jssc.SerialPort.openPort(SerialPort.java:169)
    at com.shyam.androidjssc.MainActivity.openSerialPort(MainActivity.kt:86)
    at com.shyam.androidjssc.MainActivity.findUsbDriver(MainActivity.kt:107)
    at com.shyam.androidjssc.MainActivity.onCreate(MainActivity.kt:32)

我已向 Android 请求此 USB 设备的权限,并已通过以下方式声明支持它的 UsbInterface:

private fun openSerialPort(device: UsbDevice) {
    try {
        val manager = getSystemService<UsbManager>() ?: return
        val connection = manager.openDevice(device) ?: return

        val usbInterface = 0.until(device.interfaceCount)
            .map(device::getInterface)
            .firstOrNull { it.interfaceClass == UsbConstants.USB_CLASS_CDC_DATA }
            ?: return

        println("USB connection opened. Device name: ${device.deviceName}; Serial; ${connection.serial}; Claimed: ${connection.claimInterface(usbInterface,false)}")

        serialPort = SerialPort(device.deviceName).apply {
            openPort()
            setParams(BAUD_RATE,8,1,0)
            flowControlMode = SerialPort.FLOWCONTROL_XONXOFF_OUT
            addEventListener(mSerialPortEventListener)
        }
    } catch (e: SerialPortException) {
        Log.e(TAG,"Unable to open port",e)
    }
}

不幸的是,这并没有给我许可。

接下来,我尝试使用从UsbDeviceConnection返回的文件描述符打开端口(hComm是usbDeviceConnection.getFileDescriptor()通过JNI传递给NDK`的结果:

        termios *settings = new termios();
        if(tcgetattr(hComm,settings) == 0). {
        // Woo hoo! I'm in!
        }
        else {
            close(hComm);//since 2.7.0
            hComm = jssc_SerialNativeInterface_ERR_INCORRECT_SERIAL_PORT;//-4;
        }

然而,tcgetattr(hComm,settings) 返回一个非零值。我认为这是因为文件描述符来自 /dev/bus/usb/001/002 路径而不是 /dev/ttty/* 但这纯粹是推测,我不确定我在做什么。

非常感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...