用C#进行USB串口通信,Linux权限问题

问题描述 投票:0回答:1

我在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是通过启动程序启动的,会不会导致不能以我的用户身份运行?

c# linux permissions serial-port mono
1个回答
0
投票

我会仔细检查ACM设备是不是重新连接和被赋予ACM123等而不是0.我已经有了问题,它已经超时,重新连接和数字已经增加,因为他们是虚拟的,这可以发生非常迅速和系统不删除之前的devicefile之前创建新的。如果你输入 dmesg 进入终端,它将显示任何重新连接和他们被分配的端口,运行 sudo dmesg -c 将清除输出,因为它可能是相当啰嗦的。

希望能帮到你。硬件有时是很痛苦的工作。


0
投票

我终于找到了罪魁祸首。显然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
© www.soinside.com 2019 - 2024. All rights reserved.