我有一个带有内置 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 尝试了上述所有操作。它肯定会打开端口并进行通信,但无论写入什么内容,都不会返回任何信息。
更新 2:看起来它可能与设备驱动程序相关。一些额外的背景研究表明,一些 PL2303 芯片具有支持半双工的功能,但这不受 Linux 驱动程序支持。 Windows 演示应用程序附带专用设备驱动程序,该应用程序无法在使用默认 Windows 驱动程序的干净测试机上运行。这让我觉得虽然我可以通过 Python 成功连接到它,但我无法控制双工通信(例如,即使以 STX/ETX 方式),因此这可能是一个无望的情况。 感叹。
更新 3:感谢下面的评论。但是,我找不到任何解决方法。我尝试了 USB 协议(protocol)分析器,并尝试拆卸驱动程序,但它变得相当耗时,所以最后我将设备拆开,经过一些修补后,我设法用合适的 PL2303 部件替换现有的 USB 串行适配器- 在设备方面,它只是一个基本的 2 线串行接口(interface),所以它不关心与它通信的是什么。我似乎无法结束这个问题,所以我将保持原样。
最佳答案
尝试
s.flush()
就在你的 s.write 电话之后
关于python - Python中的半双工串行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13567761/