串口通讯一对一

时间:2013-06-05 20:35:04

标签: python serial-port arduino pyserial

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

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

那么这笔交易是什么?串行通信仅在单个客户端和单个服务器之间工作吗?有没有办法让多个客户端写入服务器?感谢您的建议。

3 个答案:

答案 0 :(得分:1)

嗯,你的问题可能很广泛,所以我要给我的答案分层:

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

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

    • 在unix中,一切都是文件,你的串行连接也是一个:例如,linux上的/dev/ttyACM0
    • 如果您打开该文件的进程,它将阻止它(使用ioctl,iirc),因此其他进程也无法处理该文件。
    • 然后,您可以使用打开它的进程输入并输出到该文件,这就是全部。

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

要轻松输出可以重定向unix方式的东西(使用管道),您可以使用socathttp://www.dest-unreach.org/socat/

这是一个用法示例:

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

你可能想根据自己的需要调整它。

答案 1 :(得分:1)

修改 我忘了RS-485,'jdr5ca'很聪明,值得推荐。我在下面的解释仅限于RS-232,更多“花园品种”串口。正如'jdr5ca'指出的那样,RS-485是解决上述问题的更好选择。

<强>原始 要稍微扩展zmo的答案,可能在硬件级别共享串行,并且之前已经完成,但实际上很少完成。

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

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

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

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

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

答案 2 :(得分:1)

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

RS-485

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

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

Example computer USB adapter with 485 interface Sample RS485 transceiver chip from Element14

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

  • 001SETLIGHT1 &lt; - 告诉Arduino“001”打开灯
  • 013SETLIGHT0 &lt; - 告诉“013”关灯

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

  • 001SETLIGHT1DONE &lt; - 来自设备“001”的响应,表明该命令已被接收并执行

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