如何通过 C++ 库在 Unity Linux 上的串行端口上读写?

How to read and write on serial ports on Unity Linux through C++ library?

  1. 问题介绍

我正在用 C++ 开发一个库,它允许我使用串行端口与通过 USB 读写连接的设备进行通信,在 Windows 中它工作得很好,但在 Linux 中能够为了与我需要读写的设备进行通信,我在每个设备对应的“/dev/tty*”文件中进行通信,为此我使用“打开”功能打开相应的文件,如下所示:

int fileId = open(fileAddress, O_RDWR);

但此函数返回 -1,除非我使用以下命令将主要用户包括在拨出组中:

sudo adduser $USER dialout
  1. Unity 中的问题

有了这个,我验证了我的 C++ 测试中一切正常,但是当我尝试将库包含在 Unity 项目中时,我意识到它再次失败,因为它无法访问串行端口

由于我感兴趣的是通过C++实现的串口通讯,因为是跨平台的库,所以不能直接和C#进行通讯

  1. 解决方案尝试

我也在寻找一些可能的解决方案来解决上述问题like in this case,但尝试了一段时间后我无法让 flatpak 找到 UnityHub,因为调用此命令时:

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

它给我带来了以下错误:

error: app/com.unity.UnityHub/x86_64/stable is not installed

尽管我是按照 official Unity installation guide for Ubuntu

安装的

我还尝试将 unity 添加到远程 flatpak 存储库,使用以下命令查看是否是问题所在:

flatpak remote-add UnityHub https://hub.unity3d.com/linux/repos/deb

但它抛出以下错误:

error: GPG verification enabled, but no summary found (check that the configured URL in remote config is correct)
  1. 最后一题

总而言之,我的主要问题是,我到底应该怎么做才能在 Unity 中启用串行端口的读写权限and/or解决这个问题的最佳方法是什么?

编辑:

正如我在评论中所说,我已经尝试将用户添加到拨出,但显然 Unity 仍然无法访问具有响应 to this post 中提到的配置的串行端口,workaround 我所做的是在特定的 tty 文件上应用 chmod,问题是我必须手动执行此操作,并且在构建 Unity 时不切实际,任何用户 运行 应用程序必须手动找到相应的 tty 文件并对其应用 chmod,如果没有任何其他方法可以做到这一点,那么至少有一些方法可以自动应用 chmod 或解决这个问题吗?

我不太确定问题出在哪里,但我会尽力提供帮助。

您链接到的 official Unity installation guide for Ubuntu 没有将 Unity 安装为 flatpak。

这就解释了为什么 flatpak 告诉你它没有安装。

您链接到的问题描述了访问串行端口时 flatpak 的沙箱如何影响 Unity。

除非您遵循的教程与链接的教程不同,否则这对您不适用。

我认为您的问题是 Ubuntu 的权限默认情况下没有设置为串行端口访问。没有“自动”的方法来解决这个问题,因为它需要 root 权限才能更改。您可以做的是将程序捆绑在“安装程序”shell 脚本中,并且 运行 每当您需要更改权限时。

命令行版本

#!/bin/sh
sudo usermod -a -G dialout "$USER"

图形版本(弹出窗口询问密码)

#!/bin/sh
pkexec usermod -a -G dialout "$USER"

这不是 100% 可移植的,因为并非所有 Linux 发行版都使用 dialout 组,(例如,Arch Linux 使用 uucp)但它是在 Ubuntu.

上可能足以满足您的目的