无法通过 USB 串行 python 库与数字百分表通信
Posted
技术标签:
【中文标题】无法通过 USB 串行 python 库与数字百分表通信【英文标题】:Failing to communicate with digital dial indicator via USB serial python library 【发布时间】:2021-03-17 14:39:13 【问题描述】:我有这个数字百分表:Helios-Preisser Digimet 1722-502"。它具有通过 USB 串行电缆输出读数的能力。USB 电缆末端是一个特殊的 4 针连接器,可插入卡尺和另一端的普通 USB。
虽然设备自带特殊软件,但我正在尝试编写一个基本的python库来与它通信。下面是解释数据通信协议的manuel的sn-p
我正在使用 python Serial 库,并设法与它进行一些通信。这是我目前所拥有的
import serial
ser = serial.Serial(port ='/dev/tty.usbserial-MA4LOCLF', baudrate=4800,parity=serial.PARITY_EVEN, bytesize=serial.SEVENBITS,stopbits=serial.STOPBITS_TWO, dsrdtr=True, xonxoff=True)
# press the small red button on the cable. This generates a data entry
In [77]: ser.inWaiting()
Out[77]: 8
In [78]: ser.read(8)
Out[78]: '+000.00\r'
因此,当使用插入千分表的电缆上的红色小按钮来请求数据的模式时,这非常有用
但是,还有另一种模式可以请求数据输入。这是手册中描述为“通过外围设备请求进行数据传输”的模式,其中必须将 DataRequest 引脚脉冲低至 T1(100ms 我有点想不通。我知道此模式有效,因为当您下载(仅在 Windows 中)设备随附的软件时,您可以发送该请求。所以必须有一种方法可以用 python 串行库模拟这个请求,但我被卡住了,我什至不知道如何继续。
任何帮助,将不胜感激。
谢谢In [79]: ser.write('0\r')
Out[79]: 2
In [80]: ser.inWaiting()
Out[80]: 0
【问题讨论】:
【参考方案1】:pyserial 支持(或者应该,但最终取决于驱动程序而不是 pyserial 本身)一个更改端口控制线状态的函数。
你需要做这样的事情:
ser.setDTR(False)
time.sleep(0.5)
ser.setDTR(True)
如果您在获得所需值后立即从端口读取。
要获得或多或少正确的时间,您应该将代码作为脚本运行,而不是逐行运行。
【讨论】:
嗨 Marcos G,所以你是说如果我运行上面的那些线,我应该在带有 DTR 线的 USB 引脚上看到(不确定它是哪一个,但只有一个 Transmit , 接收, +Vdd, -Vdd),电压应该从 +Vdd 到 -Vdd 回到 +Vdd。我想我会尝试一下,并用电压表探测 USB 输出线,看看它是否符合我的要求。然后我会在百分表上试一试,看看是否有效。 是的,没错。您应该看到 DTR 行发生了变化。实际上,您的端口似乎没有接收线,而只有 TX、DTR 和 RTS。 我忘了说你需要仔细检查你在 Linux 上使用的驱动程序。set.DTR()
函数很可能在 Windows 上运行良好,但在 Linux 上却不行。您可以做的一件事是在 Windows 上尝试使用 Python。
嗨,Marcos,感谢您的提示。我实际上是在我的 mac osx 笔记本电脑上测试这些功能。我将在星期一测试所有这些并在此处提供反馈。
啊,我想知道端口名称,现在我知道它来自哪里。无论如何,您需要找出您正在处理的串行芯片以及 Mac 驱动程序来自哪里。可能是pyserial的控制功能只能在Windows下工作。您自己安装了 Mac 的驱动程序吗?或者它可能已经在系统中?【参考方案2】:
好的,经过多次“折腾”,我能够调试这个问题并找到解决方案,但它肯定不是一个线性过程。我应该指出,由于 Marcos G. 的建议,我走上了正确的道路,他指出您确实可以直接使用 pyserial 控制 dtr 行。
这就是答案。 在网上搜索了一些之后,我发现了这个link,它提供了关于如何在 Mac 上排除串行连接故障的建议。这个 Coolterm 软件非常有用。
我下载了它,它允许您在与设备进行实时通信时监控各种 RTS 和 DTS(以及其他)线路的状态。超级好用!
这告诉我:
当通过按下红色按钮从设备“发送”读数时,DTR 线为 True,而 RTS 线无关紧要。这确实是文档中显示的内容。 为了从设备“请求”读数,DTR 线需要为 False,RTS 线需要以精确的时序从 False 脉冲到 True 再返回 False。这有效,并且确实在 USB 线上产生了读取等待。下面是代码
import time
import serial
ser = serial.Serial(port ='/dev/tty.usbserial-MA4LOCLF', baudrate=4800,parity=serial.PARITY_EVEN, bytesize=serial.SEVENBITS,stopbits=serial.STOPBITS_TWO, dsrdtr=True)
ser.dtr=False
ser.rts=False
# request one reading every second
while(1):
ser.rts=True
time.sleep(0.1)
ser.rts=False
time.sleep(0.1)
print ser.read(ser.inWaiting())
time.sleep(1)
【讨论】:
我认为您不了解 SO 的工作原理。我可以看到我的答案如何没有立即解决您的问题,但是根据我的建议编写您自己的答案,甚至不给它任何信用都不是解决问题的方法。我很高兴你设法让它工作,但不要指望我提供更多帮助。 嗨,马科斯,我并不是要诋毁您提供的帮助。请告诉我如何给予它适当的信任,我会的。我同意我可能不理解 SO 的工作原理,我很乐意纠正我的错误。 对不起,我不是故意的。以我的拙见,您至少应该提到您从其他人的回答或评论中获得了这个想法。如果我的回答是促使您找到解决问题的正确方法的原因,那么(在我看来)您应该将其标记为解决方案。那么没有什么可以阻止您详细说明自己的答案。参见例如this Q&A。以上是关于无法通过 USB 串行 python 库与数字百分表通信的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# 通过“USB 虚拟串行端口”与 USB 设备通信?