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