我正在尝试编写一个跨平台 GUI 来控制在 Windows 和 Android 上使用的硬件。我使用的是 FTDI 串行电缆。当电缆插入时,SerialPort.GetPortNames() 将电缆标识为
/dev/ttyUSB0
当我尝试打开与此端口的连接时,出现异常并显示以下消息:
Access to the port '/dev/ttyUSB0' is denied.
我还尝试了以下字符串:
'ttyUSB0', 'USB0', 'dev/ttyUSB0'
我可以确认 Play 商店中的“串行 USB 终端”软件在我的 Android 设备上运行良好。我可以毫无问题地连接和发送字符串。
这个是跨平台的吗?
有关 Port.IO.SerialPort 支持 Android 能力的信息。
https://github.com/dotnet/runtime/pull/95749
我的问题:
据我所知:
我的感觉是,它的 Open() 依赖于 Linux,并期望按照以下方式安装驱动程序:
https://ftdichip.com/wp-content/uploads/2020/08/AN_220_FTDI_Drivers_Installation_Guide_for_Linux-1.pdf
欢迎在这里分享您的经验。当我看到“GetPortNames()”在我的手机上运行时,我非常兴奋,但再也没有进一步的了解。我是如此接近!
我的设置:
调试:
异常信息如下:
Access to the port '/dev/ttyUSB0' is denied.
at System.IO.Ports.SafeSerialDeviceHandle.Open(string portName)
at System.IO.Ports.SerialStream..ctor(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, int readTimeout, int writeTimeout, Handshake handshake,
bool dtrEnable, bool rtsEnable, bool _1 , byte _2)
at System.IO.Ports.SerialPort.Open()
at .. < then into my project code>
我认为异常消息与 .NET SerialPort 库中的这一行相关
https://github.com/dotnet/runtime/blob/1d1bf92fcf43aa6981804dc53c5174445069c9e4/src/libraries/System.IO.Ports/src/System/IO/Ports/SafeSerialDeviceHandle.Unix.cs#L29
我联系了开发商并得到了以下答复:
嘿,是的,System.IO.Ports 实现使用 /dev/tty 许多 Unix 系统共有的功能。不幸的是Android通过 默认情况下有一个 SELinux 策略阻止访问该设备:
https://github.com/dotnet/runtime/issues/86619#issuecomment-1843502371如果您尝试
,也会发生同样的情况 在常规的本机 C 代码中。fopen("/dev/ttyUSB0", "r+")
如果您无法root设备或无法使用自定义Android,那么据我所知 知道你运气不好,需要依赖自定义库/驱动程序。