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

2024-06-17 12:02:41 发布

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

我有一个数字千分表: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'

因此,当使用该模式时,按下插入千分表的电缆上的红色小按钮请求数据时,这种方式非常有效

但是,还有另一种模式,用户可以请求数据输入。这是手册中描述的“通过外围设备请求进行数据传输”模式,用户必须为T1(100ms<;T1<;1000ms)低脉冲数据请求引脚。 我几乎是随机地尝试了所有可能的组合,我认为可以让这个数据请求工作,但没有结果。所有尝试使用串行库中的写函数都没有工作

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

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

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


Tags: the数据用户intrue软件serial模式
2条回答

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

您需要这样做:

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

如果您在读取端口后立即读取,应该会得到您要查找的值

要获得大致正确的时间,您应该将代码作为脚本运行,而不是逐行运行

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

答案是这样的。 在进一步搜索web之后,我发现了这个link,它为如何在mac上排除串行连接故障提供了建议。这个Coolterm软件非常有用

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

这向我表明:

  • 当按下红色按钮从设备“发送”读数时,DTR线路为真,RTS线路不相关。这确实是文档中显示的内容
  • 为了“请求”来自设备的读数,DTR线需要为假,RTS线需要通过精确的定时从假到真再到假进行脉冲。这起作用了,确实产生了一个等待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)

相关问题 更多 >