Последовательная связь по USB с разрешением C#, Linux - PullRequest
0 голосов
/ 01 мая 2020

У меня проблема с последовательным соединением на Linux. Я пытаюсь отправить и получить информацию между Arduino и движком Unity3D, который использует C# (моно) для открытия последовательной связи. Но я подозреваю, что это проблема с разрешениями Linux, поэтому я публикую это здесь. Я уже добавил пользователя в группу дозвона, и последовательная связь фактически работает, когда я компилирую и запускаю следующее C# с использованием mono:

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 распознается лишь несколько файлов, только те, у которых есть «другие» разрешения на чтение. Напротив, когда я компилирую это вне единства с моно, все файлы в / dev печатаются.

Это смущает меня, разве Unity3D также не должен запускаться с моим идентификатором пользователя, и, в свою очередь, иметь доступ к разрешения для группы удаленного доступа? Unity3D запускается через приложение запуска, может ли это привести к тому, что оно не будет запущено моим пользователем?

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Я наконец нашел виновника. По всей видимости, Unity3D недавно сменил свой модуль запуска (Unity Hub) на версию для песочницы, используя flatpak, и по какой-то причине / dev по умолчанию занесен в черный список. Чтобы обойти этот Unity Hub, нужно запустить с параметром:

--device=all

Вся команда, чтобы заставить это работать для меня:

/usr/bin/flatpak run --branch=stable --arch=x86_64 --device=all --command=start-unityhub com.unity.UnityHub
0 голосов
/ 01 мая 2020

Я бы дважды проверил, что устройство ACM не переподключается и получает вместо ACM1 / 2/3 et c. У меня была проблема, что оно истекло, переподключено и число увеличилось, потому что они виртуальные, это может произойти очень быстро, и система не удаляет предыдущий файл устройства перед созданием нового. Если вы введете dmesg в терминал, он покажет все повторные соединения и какой порт им назначен, запуск sudo dmesg -c очистит вывод, поскольку он может быть довольно многословным.

Надеюсь, это поможет. С аппаратными средствами иногда бывает трудно работать.

...