【问题标题】:How to find out if serial port is closed?如何判断串口是否关闭?
【发布时间】:2012-06-26 07:37:38
【问题描述】:

我正在开发一个用于处理串行/USB 端口的多线程服务器应用程序。

问题是,如果拔下电缆,pyserial 会不断报告端口已打开且可用。阅读时我只收到Empty 异常(由于读取超时)。

如何得知某个端口已断开连接,以便处理这种情况?

编辑:操作系统是 Ubuntu 12.04

编辑 2:澄清 - 我通过 Serial to USB 连接器连接到串行端口设备,因此断开连接的设备是 USB 设备。

【问题讨论】:

  • 在 linux 上你可以使用 dmesg 来完成这类任务
  • 我需要一个适用于我的 Python 应用程序的解决方案,以便在端口丢失时关闭整个进程。
  • 它将适用于您的 python 应用程序。例如伪代码:while(subprocess(dmesg | tail "any grep params")): do
  • @ZagorulkinDmitry:这可能行得通,但感觉不够洁净。特别是因为 dmesg 指定驱动程序 inf/ttyUSB 而不是链接的端口名称(这是我唯一可用的确定性信息)。

标签: python pyserial


【解决方案1】:

串行端口没有“电缆连接”或未连接的真正概念。

根据您使用的设备,您可以尝试轮询 DSR 或 CTS 线路,并在这些线路在一定时间内保持低电平时确定没有连接设备。

来自维基百科:

DTR 和 DSR 通常始终处于开启状态,并且根据 RS-232 标准 及其后继者,用于从每一端发出信号,表明另一端 设备实际存在并通电

因此,如果您有符合要求的设备,那么 DSR 线可能就是您所需要的。

编辑: 由于您似乎使用USB2Serial转换器,您可以尝试检查设备节点是否仍然存在 - 您无需尝试打开它。

所以 os.path.exists(devNode) 就足够了。

【讨论】:

  • 有趣的是,操作系统知道设备何时连接(/dev/ttyUSBX)并且我为每个设备使用固定的符号链接(例如:/dev/mycustomLink),当电缆断开时,操作系统知道它并从列表中删除设备。因此,我会很高兴有一种优雅的方式来轮询操作系统的设备状态(它是存在还是不存在)
  • @JanezStupar 您在这里描述的是拔下 USB 插头时会发生什么。那是可以检测到的。这个答案描述了如果拔掉 RS232 插头会发生什么。
  • 啊。您在这里谈论的是USB设备;您将需要一个 USB 库然后轮询该设备的存在。否则,您可以简单地轮询设备节点(您一开始打开的/dev/ttyUSBx)是否仍然可用,这对您来说就足够了吗?
  • @user1442158:那么我该如何以理智的方式轮询设备呢?只是尝试打开新的连接或其他什么?
  • @JanezStupar:试试 /dev/ttyUSB0 是否仍然存在(您是否可以统计该文件) - 如果存在,则仍应连接 USB 2 串行转换器。但是,您无法通过该测试检测电缆的串行部分是否已被移除; DSR 线路可以为您提供该信息
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
相关资源
最近更新 更多