问题描述
我正在尝试通过 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 (将#修改为@)