如何在native_sim上使用Zephyr实现总线类型串行链接(可能使用socat)?

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

我是一名电气工程师,目前正在使用 Zephyr 进行自动化测试(我想使用 native_sim 使应用程序逻辑开发+测试与硬件开发更加分离)作为一种业余爱好。物理板具有 RS485 总线连接,可将多个板连接在一起。

将 Zephyr 作为 Linux 应用程序运行允许为其串行连接分配 PTY。然而,如果我让我的(测试)主管启动所有必要的 16 个实例,我就会剩下 16 个 PTY 设备,并且需要以“总线类型”方式连接所有这些设备。在这种情况下,总线类型意味着“Zephyr ptyN 发送的任何内容都会被所有其他 Zephyr pty 实例接收”。理论上,更高级别的协议排除了传输重叠,这应该解决并发写入缓冲区的问题。

人们似乎使用两种常见的方法将多个串口连接在一起:

socat
tty0tty
。然而,tty0tty 仅将两个数据流连接在一起,因此这并不是一个真正的选择。

我也许能够在每个实例的基础上使用

socat
将其自身附加到 Zephyr pty,并在另一端连接到基于 TCP 连接的中继服务器,也许也是一个
socat
实例。一个文件不能多次打开,因此本地文件绑定也不起作用。这意味着管理单个实例的两个程序的状态,这并不是更好的选择。

根据我在互联网上搜索了解到的情况,使用 Linux 平台上常用的工具似乎无法实现这样的“共享缓冲区”解决方案。在这里,我将使用 Python 创建一个小型装置(基本上是一个中继服务器),与上面的完全相同:

  • 从主管处获取文件描述符列表(可以在 Zephyr 中强制使用 PTY 文件名),打开它们并等待输入
  • 收到输入后,将输入复制到所有其他文件描述符输出缓冲区中
  • 聆听主管的关机信号

这就是我的 Linux/Unix 知识的极限。我知道我能够以这种方式实现它,但如果可能的话,当可能有更基本的基于 Linux 的方法时,我更喜欢不依赖自制代码的解决方案。我不可能是唯一需要在串行接口之间“克隆流量”的人:

是否有另一种可能更简单/简化的方法来解决所有这些问题并简单地使用 socat 来实现总线类型串行连接?

serial-port rs485 multiplexing zephyr-rtos
1个回答
0
投票

Socat 1.8 版包含一个 shell 脚本 socat-broker.sh ,它可能可以满足您的需要。以如下方式开始:

socat-broker.sh TCP-L:1234

然后启动每个 pty N 的连接器:

socat /dev/ptyN TCP:localhost:1234

请注意,此脚本需要socat 1.8.0.0;它在内部与环回接口上的 UDP/IPv4 广播一起工作以进行数据复制。通信不受本地用户和进程的保护!

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.