我在Linux上遇到一个串行通信问题。我试图在arduino和Unity3D引擎之间发送和接收信息,Unity3D引擎使用C#(单声道)打开串行通信。但我怀疑这是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不能访问devttyACM0 而在另一种情况下却可以?或者说有什么办法可以让我找到答案?
EDIT.我玩了一下下面的程序,结果发现,Unity3D无法访问devttyACM0,而另一个却可以。
我玩了一下下面的程序来检查程序可以读取的内容
string[] fileArray = Directory.GetFiles(@"/dev");
foreach(string s in fileArray)
{
Console.WriteLine(s);
}
当在Unity3D内部运行时 只有少数几个文件被识别出来 只有那些有 "其他 "读取权限的文件 相反,当我在Unity外部用mono编译时 所有dev中的文件都被打印出来了
这让我很困惑,Unity3D是不是也应该用我的用户ID来运行,进而获得拨出组的权限?Unity3D是通过启动程序启动的,会不会导致不能以我的用户身份运行?
我会仔细检查ACM设备是不是重新连接和被赋予ACM123等而不是0.我已经有了问题,它已经超时,重新连接和数字已经增加,因为他们是虚拟的,这可以发生非常迅速和系统不删除之前的devicefile之前创建新的。如果你输入 dmesg
进入终端,它将显示任何重新连接和他们被分配的端口,运行 sudo dmesg -c
将清除输出,因为它可能是相当啰嗦的。
希望能帮到你。硬件有时是很痛苦的工作。
我终于找到了罪魁祸首。显然Unity3D最近把他们的启动器(Unity Hub)改成了使用flatpak的沙盒版本,由于某些原因,dev被默认为黑名单.为了绕过这个问题,Unity Hub应该用参数启动。
--device=all
为了解决这个问题 Unity Hub应该用以下参数启动:
/usr/bin/flatpak run --branch=stable --arch=x86_64 --device=all --command=start-unityhub com.unity.UnityHub