0

我正在尝试通过 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/*但这纯粹是猜想,我不确定我在做什么。

非常感谢您的帮助。

4

0 回答 0