Python 一对一串行通信

Python 一对一串行通信,python,serial-port,arduino,pyserial,Python,Serial Port,Arduino,Pyserial,如果这是一个愚蠢的问题,请不要介意我。但我花了一些时间试图找到答案,但我无法得到任何可靠的答案。也许这是一个硬件问题,但我想我应该先试试这里 串行通信只能一对一工作吗?出现这种情况的原因是因为我有一个arduino板在其串行端口上监听通信。我还有一个python脚本将字节馈送到端口。然而,每当我打开arduino的串行监视器时,与python脚本的连接就失败了。串行监视器还连接到串行端口,用于其小文本输入字段的通信 那怎么办?串行通信是否仅在单个客户端和单个服务器之间工作?有没有办法让多个客户端

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

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


那怎么办?串行通信是否仅在单个客户端和单个服务器之间工作?有没有办法让多个客户端写入服务器?我感谢你的建议。

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

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

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

    • 在unix中,一切都是一个文件,您的串行连接也是一个:例如,linux上的
      /dev/ttyACM0
    • 当您有一个进程打开该文件时,它将阻止该文件(使用
      ioctl
      ,iirc),因此没有其他进程也会干扰该文件
    • 然后,您可以使用打开该文件的进程来输入和输出该文件,仅此而已
但是,希望仍然可以共享进程之间的连接。其中之一就是使用
tee
命令,该命令将能够从一个进程获取输入,并将其返回输出,然后将输出复制到另一个进程。您还可以在python中通过复制文件描述符来实现这一点

要方便地输出可以通过unix方式重定向的内容(使用管道),可以使用
socat

下面是一个用法示例:

socat -,raw,echo=0,escape=0x0f /dev/ttyACM0,raw,echo=0,crnl
您可能需要根据需要调整它。

编辑: 我忘了RS-485,它的“jdr5ca”非常聪明,值得推荐。我下面的解释仅限于RS-232,这是一个更“花园式”的串行端口。正如“jdr5ca”所指出的,RS-485是解决所述问题的更好的选择

原件: 为了进一步扩展zmo的答案,可以在硬件级别共享串行数据,以前已经这样做过,但在实践中很少这样做

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

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

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

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

无论是真正的混乱还是有趣的挑战,取决于您的需求和您如何看待这些事情。

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

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

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

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


  • 001SETLIGHT1您可以发布一些代码吗?你在用什么图书馆?连载?为了更快地获得更好的帮助,张贴一个“一对一”的贴子,恰当的术语是“点对点”与“多点”。EIA/RS232连接使用链路而不是总线。USB(以及PCI、VME、ISA)是一种总线