【问题标题】:Half-duplex serial communications in PythonPython中的半双工串行通信
【发布时间】:2018-10-03 09:12:22
【问题描述】:

我有一个带有内置 USB/串行适配器的设备(显示为 Prolific PL2303)。设备文档提供了有关如何与其通信的完整详细信息,并提供了一个示例 Windows 应用程序。但是,我需要在 Linux 上使用它——最好是使用 Python,但我对此并不太重视。

设备文档指出设备在 9600、8N1 下运行,具有半双工。 Windows 应用程序运行良好 - 设备运行良好(所以我知道这不是设备问题)。但是,我无法在 Linux 上使用 Python 与它进行通信。我正在使用 pySerial,并且我尝试了一个类似的(全双工,也是 PL2303)设备,它工作正常。

我尝试了几种设置 xonxoff、rtscts 等的组合。我还尝试使用 setRTS(True) 切换 RTS 并检查 CTS 和 DSR 等 - 全部返回 False。我可以使用 pySerial 成功打开设备(我可以看到活动指示灯闪烁 - 简单但有效的测试)如果您在读/写期间拔下它,pySerial 会抱怨。

我设置什么标志/行或发送什么数据似乎并不重要,总是得到相同的结果。

>>> s=serial.Serial()
>>> s.port('/dev/ttyUSB1')
>>> s.open()
>>> s
Serial<id=0x7fe94b533b50, open=True>(port='/dev/ttyUSB1', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=3, xonxoff=0, rtscts=0, dsrdtr=0)
>>> s.write('\2CMD2292\r')  
>>> s.inWaiting()
0
>>> s.setRTS(True)
>>> s.getCTS()
False
(several iterations of above with different flags).

忽略写入命令中的数据 - 这只是一个状态检查命令。不管那里发生了什么,设备都应该以答案或错误来响应。

我什至在设置各种 ctsrts 标志等之间关闭并重新打开设备,然后拔下/重新插入以强制重置。如上所述,它继续使用 Windows 测试应用程序正常工作。我无法使用 Portmon 等来嗅探 Windows 端口流量,因为它是 64 位 Win7 安装,我目前没有时间构建 XP 机器。

有什么想法吗?

更新:我还在演示应用程序所在的同一个 Windows 机器上使用 Python 尝试了上述所有方法。它肯定会打开端口并进行通信,但无论写入什么内容,都没有返回任何信息。

UPDATE2:看起来它可能与设备驱动程序相关。一些额外的背景研究表明,一些 PL2303 芯片具有支持半双工的功能,但这不受 Linux 驱动程序的支持。 Windows 演示应用程序附带一个专用设备驱动程序,并且该应用程序无法在使用默认 Windows 驱动程序的干净测试机器上运行。这让我觉得虽然我可以通过 Python 成功连接到它,但我无法控制双工通信(例如,即使以 STX/ETX 方式),因此这可能是一个绝望的案例。 叹息

UPDATE3:感谢下面的 cmets。但是,我找不到任何解决方法。我尝试了 USB 协议分析器,并尝试拆卸驱动程序,但它变得相当耗时,所以最后我将设备拆开,经过一些修补后,我设法用合适的 PL2303 部件替换了现有的 USB 串行适配器- 在设备方面,它只是一个基本的 2 线串行接口,所以它不关心与它交谈的内容。我似乎无法结束这个问题,所以我会保持原样。

【问题讨论】:

  • 您是否尝试过使用串行通信程序 minicom 与 Linux 机器上的设备通信?这应该允许您在深入研究 Python 实现之前验证设备在 Linux 上工作。
  • 是的 - 我尝试使用 minicom 与它交谈,但没有得到任何响应 - 但是我找不到任何方法来手动切换 minicom 中的 RTS,这就是我尝试的原因Python。我知道 pySerial 正在连接到设备并发送数据(参见上面的参考。闪光的灯:))。
  • 你从哪里弄来的驱动程序?它是您发行版的一部分还是您手动构建的?你是根吗?
  • 驱动程序是内核的一部分,因为 ~2.4 AFAIK。还在两个不同的发行版(Debian 和 Fedora)上尝试过相同的驱动程序。以 root 身份尝试过(用户也有权访问设备)并且行为没有差异。
  • 你知道设备应该响应的一些命令吗?你能告诉它是什么设备吗?

标签: python linux serial-port usbserial


【解决方案1】:

试试

s.flush()

就在您的 s.write 通话之后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2013-12-01
    相关资源
    最近更新 更多