无法通过USB串行python库与数字千分表通信

时间:2021-03-17 14:39:13

标签: python usb pyserial

我有这个数字千分表:Helios-Preisser Digimet 1722-502"。它具有通过 USB 串行电缆输出读数的能力。USB 电缆末端是一个特殊的 4 针连接器,可插入到卡钳和另一端的普通 USB。

虽然设备自带特殊软件,但我正在尝试编写一个基本的python库来与之通信。以下是解释数据通信协议的手册片段

我正在使用 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'

因此,当使用通过按下插入拨号指示器的电缆上的红色小按钮来请求数据的模式时,这非常有效

但是,还有另一种模式可以请求数据输入。这是手册中描述的“通过外设请求进行数据传输”的模式,其中必须在 T1 期间将 DataRequest 引脚脉冲为低电平(100ms

In [79]: ser.write('0\r')
Out[79]: 2

In [80]: ser.inWaiting()
Out[80]: 0

我有点想不通了。我知道此模式有效,因为当您下载(仅在 Windows 中)设备随附的软件时,您可以发送该请求。所以必须有一种方法可以用 python 串行库模拟这个请求,但我被卡住了,我什至不确定如何继续。 任何帮助,将不胜感激。 谢谢

2 个答案:

答案 0 :(得分:0)

pyserial 支持(或者它应该,但最终取决于驱动程序而不是 pyserial 本身)一个改变端口控制线状态的函数。

你需要做这样的事情:

ser.setDTR(False)
time.sleep(0.5)
ser.setDTR(True)

如果您在读取后立即从端口读取,您应该会得到您正在寻找的值。

为了使时间或多或少正确,您应该将代码作为脚本而不是逐行运行。

答案 1 :(得分:0)

好的,经过多次“混乱”之后,我能够调试这个问题并找到解决方案,但这肯定不是一个线性过程。我应该指出,由于 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)