串行通信一对一的(Serial Communication one to one)

2019-10-18 05:51发布

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

难道串行通信只工作一比一? 这想出的原因是因为我有一个Arduino板监听其串行端口的通信。 我有一个python脚本饲料字节到端口为好。 但是,每当我打开了Arduino的串行显示器,用python脚本连接失败。 串行监视器还连接到串行端口,用于其小的文本输入场通信。

所以,这是怎么回事? 难道串行通信只有一个客户机和一台服务器之间的工作吗? 有没有办法让多个客户端写入服务器? 我很欣赏你的建议。

Answer 1:

多个客户端(如Arduinos)与一个服务器通信(例如台式计算机)通常与序列变异进行:

RS-485

这是一个简单的方法,广泛使用在你想拥有通过一个串行端口连接到一台计算机的许多设备工业环境。 这种类型的布置也被称为多支路,因为建筑物周围一个电缆串与该三通抽头中和引入线路给每个设备。

造成这种情况的硬件中获得广泛应用。 你可以购买提供计算机硬件接口USB串口适配器。 编程端口看起来就像是一个RS232端口。 对于Arduino的,你想补充一个收发器芯片。 串行收发器的海上存在,如

示例计算机USB适配器485接口 从Element14添加样品RS485收发器芯片

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

  • 001SETLIGHT1 < -告诉Arduino的“001”以接通光
  • 013SETLIGHT0 < -告诉“013”来关灯

任何挂在电缆设备忽略不以他们的地址开始的命令。 当设备响应,它预先考虑它的地址。

  • 001SETLIGHT1DONE < -从设备“001”,该命令已经被接收和执行响应

在响应中的地址让接收方知道哪些设备是在说。



Answer 2:

那么,你的问题可以说是相当广泛的,所以我要去层我的回答:

  • 在硬件方面,相同的一对导线的可工作地与许多设备共享。 这主要是电子产品的问题(保持在良好的电压范围内的信号),并没有在同一时间写串口的所有设备(或者你会得到残骸)。

  • 在软件方面,在主机上, 是的 ,你可以分享到多个进程的设备相同的串行连接。 但是,这不是直线前进。 我假设你正在使用UNIX(MacOS的或Linux):

    • 在UNIX中,任何事物都是文件,你的串行连接是一个太: /dev/ttyACM0在Linux上,例如。
    • 当你有一个进程打开该文件,它会阻止它(使用ioctl ,IIRC),以便与该文件也没有其他进程可以胡来。
    • 然后,您可以输入和输出使用打开它的进程,文件,仅此而已。

但我们希望,它仍然是可以共享进程之间的连接。 其中一人将仅仅是使用tee命令,将能够从一个进程获取输入,并且还给输出,输出复制到另一个进程。 您也可以从蟒蛇内做到这一点,通过复制文件描述符。

为了能够重定向Unix的方式(使用管道)轻松输出的东西,你可以使用socat : http://www.dest-unreach.org/socat/

这里是一个使用示例:

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

您可能要调整它为您的需求。



Answer 3:

编辑:我忘了RS-485,其“jdr5ca”是足够聪明的建议。 下面我解释仅限于RS-232,更多的“花园品种”串行端口。 为“jdr5ca”所指出的,RS-485是用于说明问题的一个更好的选择。

原文:要在ZMO的回答扩展位, 可以在硬件层面共享串行和已经做过,但在实践中很少这样做。

同样,在软件驱动程序级别,这是一次理论上可以分享,但是你遇到类似的问题在硬件层面,即如何“共享”的链接,以防止碰撞等。

A“典型的”设置将彼此连接1两个串行(硬件)设备:1。 每个将运行一个单一的软件过程,将管理发送/链路上接收数据。

如果希望分享在多个进程的串行链路(两侧),管理的链接也将需要管理接收到的数据传送到每一个阅读的过程(跟踪数据的每个进程都读)的软件过程和还仲裁过程中“写”的发送过程中获得访问链接。

如果有在链路的两端多个读/写过程,这一切的握手/协调得深,可能需要某种元信令安排,协调各端的进程间通讯科。

无论是一个真正的混乱或有趣的挑战,根据您的需求,以及如何查看这样的事情。



文章来源: Serial Communication one to one