USB串行通信与C#,Linux权限问题



我在Linux上遇到串行通信问题。我正在尝试在arduino和Unity3D引擎之间发送和接收信息,该引擎使用C#(mono(打开串行通信。但我怀疑这是Linux权限的问题,这就是我在这里发布这篇文章的原因。我已经将用户添加到拨号组,当我使用mono编译和运行以下C#时,串行通信实际上正在工作:

using System.IO.Ports;
sp = new SerialPort("/dev/ttyACM0", 9600);
sp.Open();

然而,运行时Unity3D中的相同代码告诉我:

IOException: No such file or directory

令人沮丧的是,这实际上是在另一台Linux机器上运行的,我很难理解导致它无法在另一个机器上工作的区别。

以下是两种系统的一些差异:

工作中的Linux是Lubuntu 19,Unity3D安装在/home中,与root位于同一分区上。Unity3D版本为2019.2。

非工作系统是Linux Mint 19.3,Unity3D安装也在/home中,但这是一个与root不同的分区。Unity3D版本为2019.3。

权限看起来也略有不同:

crw-rw----+ 1 root dialout 166, 0 mei  1 05:08 /dev/ttyACM0    --> Lubuntu
crw-rw---- 1 root dialout 166, 0 May  1 15:03 /dev/ttyACM0     --> Mint

还有:

getfacl /dev/ttyACM0

在Lubuntu上给了我以下信息:

# file: dev/ttyACM0
# owner: root
# group: dialout
user::rw-
user:myname:rw-
group::rw-
mask::rw-
other::---

以及Linux Mint上的以下内容:

# file: dev/ttyACM0
# owner: root
# group: dialout
user::rw-
group::rw-
other::---

有人知道为什么Unity3D在一种情况下不能访问/dev/ttyACM0,而在另一种情况中可以访问吗?或者你知道我会怎么发现吗?

编辑:

我玩了一点以下内容来检查程序允许读取的内容:

string[] fileArray = Directory.GetFiles(@"/dev");
foreach(string s in fileArray)
{
Console.WriteLine(s);
}

当在Unity3D内部运行时,只有少数文件被识别,只有那些具有"其他"读取权限的文件。相反,当我使用mono在unity之外编译它时,/dev/中的所有文件都会打印出来。

这让我很困惑,Unity3D不应该也用我的用户ID运行吗?然后访问拨号组权限?Unity3D是通过启动器应用程序启动的,这会导致它不能作为我的用户运行吗?

我会仔细检查ACM设备是否没有重新连接,并被赋予ACM1/2/3等而不是0。我遇到过这样的问题,它已经超时,重新连接,并且数字增加了,因为它们是虚拟的,这种情况发生得很快,而且系统在创建新的设备文件之前不会删除以前的设备文件。如果您在终端中键入dmesg,它将显示任何重新连接以及它们被分配的端口,运行sudo dmesg -c将清除输出,因为它可能非常冗长。

希望这能有所帮助。使用硬件有时会很痛苦。

我终于找到了罪魁祸首。显然,Unity3D最近将其启动器(UnityHub(更改为使用flatpak的沙盒版本,并且由于某种原因/dev默认被列入黑名单。为了绕过这个Unity Hub,应该使用以下参数启动:

--device=all

让它为我工作的整个命令是:

/usr/bin/flatpak run --branch=stable --arch=x86_64 --device=all --command=start-unityhub com.unity.UnityHub

最新更新