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

Failing to communicate with digital dial indicator via USB serial python library

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

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

我正在使用 python 串行库,并且已经设法与它进行了一些通信。这是我目前所拥有的

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

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

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

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

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

你需要做这样的事情:

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

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

为了或多或少地获得正确的时机,您应该运行将您的代码作为脚本而不是逐行。

好吧,经过多次“折腾”,我能够调试这个问题并找到解决方案,但这肯定不是一个线性过程。我应该指出,由于 Marcos G. 的建议,我走上了正确的道路。他指出你确实可以直接用 pyserial 控制 dtr 线。

答案在这里。 在网上搜索了一些之后,我发现了这个 link,它提供了有关如何解决 mac 上的串行连接问题的建议。这个 Coolterm 软件非常有用。

我下载了它,它允许您在与设备实时通信时监控各种 RTS 和 DTS(以及其他)线路的状态。超级有用!

这告诉我:

  • 当按下红色按钮从设备“发送”读数时,DTR 线为真,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)