1

如果这是一个愚蠢的问题,请不要介意我。但是我花了一些时间试图找到答案,但我找不到任何可靠的东西。也许这是一个硬件问题,但我想我会先在这里尝试。

串行通信只能一对一工作吗?出现这种情况的原因是因为我有一个 arduino 板在其串行端口上监听通信。我也有一个 python 脚本向端口提供字节。但是,每当我打开 arduino 的串行监视器时,与 python 脚本的连接都会失败。串行监视器还连接到串行端口以用于其小文本输入字段的通信。

那么有什么关系呢?串行通信是否只能在单个客户端和单个服务器之间工作?有没有办法让多个客户端写入服务器?我很欣赏你的建议。

4

3 回答 3

1

好吧,你的问题可能很广泛,所以我要分层回答:

  • 在硬件方面,同一对电线可以与许多设备共享。这主要是电子设备的问题(将信号保持在良好的电压范围内),而不是让所有设备同时写入串行端口(否则你会得到残骸)。

  • 在软件方面,在主机上,的,您可以将相同的串行连接共享到具有多个进程的设备。但这不是直截了当的。我假设您使用的是 unix(macos 或 linux):

    • 在 unix 中,一切都是文件,您的串行连接也是一个文件:/dev/ttyACM0例如,在 linux 上。
    • 当您有一个进程打开该文件时,它将阻止它(使用ioctl,iirc),因此没有其他进程也可以处理该文件。
    • 然后,您可以使用打开它的进程输入和输出到该文件,仅此而已。

但希望仍然可以共享进程之间的连接。其中之一就是使用tee命令,该命令将能够从一个进程获取输入,并将其返回输出,并将输出复制到另一个进程。您也可以在 python 中通过复制文件描述符来执行此操作。

要轻松输出可以通过 unix 方式(使用管道)重定向的内容,您可以使用socat: http: //www.dest-unreach.org/socat/

这是一个用法示例:

socat -,raw,echo=0,escape=0x0f /dev/ttyACM0,raw,echo=0,crnl

您可能需要根据需要对其进行调整。

于 2013-06-05T23:32:42.157 回答
1

编辑: 我忘记了 RS-485,'jdr5ca' 足够聪明,可以推荐。我在下面的解释仅限于 RS-232,更“花园式”的串口。正如“jdr5ca”所指出的,RS-485 是解决上述问题的更好选择。

原文: 稍微扩展一下zmo的回答,可以在硬件层面共享serial,之前也做过,但实际很少做。

同样,在软件驱动程序级别,理论上也是可以共享的,但是您会遇到与硬件级别类似的问题,即如何“共享”链接以防止冲突等。

“典型”设置是两个串行(硬件)设备以 1:1 的方式相互连接。每个都将运行一个软件进程来管理链路上的发送/接收数据。

如果希望在多个进程(任一侧)之间共享串行链路,则管理链路的软件进程还需要管理将接收到的数据传递给每个读取进程(跟踪每个进程读取了哪些数据)和还仲裁哪个发送进程在“写入”期间可以访问链接。

如果链路的每一端都有多个读/写进程,那么所有这些的握手/协调就会变得很深,因为可能需要某种元信令安排来协调每一端进程之间的通信。

一个真正的混乱或一个有趣的挑战,取决于你的需求和你如何看待这些事情。

于 2013-06-06T00:20:07.443 回答
1

与一台服务器(例如台式计算机)通信的多个客户端(例如 Arduinos)通常使用串行变体完成:

RS-485

这是一种在工业环境中广泛使用的简单方法,您希望通过一个串行端口将许多设备连接到一台计算机。这种类型的布置也称为多点,因为一根电缆绕在建筑物周围,带有 T 型接头,可以将线路接入每个设备。

用于此的硬件是广泛可用的。您可以购买为计算机提供硬件接口的 USB 串行适配器。以编程方式,该端口看起来就像一个 RS232 端口。对于 Arduino,您只需添加一个收发器芯片。存在大量串行收发器,例如

带有 485 接口的计算机 USB 适配器 示例 来自 Element14 的示例 RS485 收发器芯片

所有设备都挂在同一条总线上同时监听。使用的简单通信协议只是在每个命令之前添加一个设备地址。例如:

  • 001SETLIGHT1 <- 告诉Arduino“001”打开灯
  • 013SETLIGHT0 <- 告诉“013”关灯

任何挂在电缆上的设备都会忽略不以其地址开头的命令。当设备响应时,它会预先添加其地址。

  • 001SETLIGHT1DONE <- 来自设备“001”的命令已接收并执行的响应

响应中的地址让接收方知道哪个设备正在通话。

于 2013-06-06T04:30:26.043 回答