Python中的半双工串行通信

2024-10-05 10:08:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

设备文件规定该设备以9600,8N1半双工运行。Windows应用程序运行良好-设备运行良好(所以我知道这不是设备问题)。但是,我无法在Linux上使用Python与它通信。我用的是pySerial,我试过一个类似的(全双工,也是PL2303)设备,它工作得很好。在

我尝试了几种设置xonxoff、rtscts等的组合,也尝试过使用setRTS(True)进行RTS切换,并检查CTS和DSR等-gets all return 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).

忽略write命令中的数据-这只是一个状态检查命令。不管去那里的是什么,设备应该响应一个答案或者一个错误。在

我甚至在设置各种ctsrts标志等,以及拔掉/重新插入设备以强制重置之间,我甚至求助于关闭和重新打开设备。如上所述,使用Windows测试应用程序,它仍然可以正常工作。我不能使用Portmon等嗅探Windows端口流量,因为它是64位的Win7安装,而且我目前没有时间构建XP机器。在

有什么想法吗?在

更新:我还尝试过在演示应用程序运行的同一个Windows系统上使用Python进行上述所有操作。它肯定会打开端口并进行通信,但是不管写了什么都不会返回任何信息。在

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

更新3:感谢你在下面的评论。然而,我找不到任何办法绕过这个问题。我试过一个USB协议分析仪,我试着拆解驱动程序,但它变得相当耗时,所以最后我把设备拆开,经过一番修补后,我设法用一个合适的PL2303部件替换了现有的USB串行适配器——在设备端,它只是一个基本的2线串行接口,所以它不在乎是什么在跟它说话。我好像没法回答这个问题,所以就不谈了。在


Tags: 程序运行falsetrue应用程序标志linuxwindows驱动程序

热门问题