Last discussion on this issue I mentioned a python program I found. I
have since put the program in Spyder using Python3. I had to make a number
of changes to accommodate the change to 3. The latest is that I see that
the readings are available to the program although parsing the data is
running into difficulty associated, I believe, with Python3's fussiness
with bytes, strings, etc. (The data I see is via some print statements
stuck in the code.)
line 72: originally it had
mult=self.units.strip()+' '[0]
TypeError: can't concat bytes to int
I tried:
mult=self.units.strip()+' '.encode()[0]
and
mult=self.units.strip()+b' '[0]
to no avail.
Note:
data = b'DC -0.000 V\r'
type data = <class 'bytes'>
01234567890123456789
type units = <class 'bytes'>
But the good news is that when I changed the reading on the meter the value
in data changed accordingly. So I see the issue now as one of knowing how
to fix the Python so that it parses the data correctly, rather than an
issue of how to communicate with the dmm.
BTW, I see no way to change the manufacture's sw running under Windows to
look at the usb, which is what I need to test the usb interface under
Windows. I will explore the usb using Linux, which is the ultimate goal.
Full program as it stands (sorry I do not have line #'s)
#!/usr/bin/python
import serial, time, os
modes=['DC V','AC V','DC uA','DC mA','DC A',
'AC uA','AC mA','AC A','OHM','CAP',
'Hz','Net Hz','Amp Hz','Duty','Net Duty',
'Amp Duty','Width','Net Width','Amp Width','Diode',
'Continuity','hFE','Logic','dBm','EF','Temperature']
segs={ 0x00: ' ',
0x20: '-',
0xd7: '0',
0x50: '1',
0xb5: '2',
0xf1: '3',
0x72: '4',
0xe3: '5',
0xe7: '6',
0x51: '7',
0xf7: '8',
0xf3: '9',
0x87: 'C',
0xa7: 'E',
0x27: 'F',
0x86: 'L',
0x66: 'h',
0x64: 'n',
0x37: 'P',
0x24: 'r',
0xa6: 't'}
byte1=['Hz','Ohms','K','M','F','A','V','m']
byte2=['u','n','dBm','S','%','hFE','REL','MIN']
byte7=['Beep','Diode','Bat','Hold','-','~','RS232','Auto']
decimal=0x08
class ChecksumError(Exception): pass
class LengthError(Exception): pass
class TimeoutError(Exception): pass
import sys
infinity=9e99999999 # and beyond!
class Packet:
def __init__(self):
self.string=''
self.unit=''
self.value=None
self.mode=None
self.packet_len=14
def load_data(self,data):
debug=True
# DC -0.000 V
# 01234567890123
if debug:
print("data = ",data)
print("type data = ",type(data))
print("0123456789"*2)
if len(data) != 14:
raise LengthError
self.mode =data[0:2]
self.sign =data[3]
self.value=data[4:9]
self.units=data[9:14].strip()
print("type units = ",type(self.units))
mult=self.units.strip()+' '[0]
print("mult = ",mult)
if not mult in "MKmunp": mult=' '
if debug:
print("mode",self.mode)
print("sign",self.sign)
print("value",self.value)
print("units",self.units)
print("mult",mult)
if data[2]!=' ' or data[13] != '\r':
raise ChecksumError
if 'O' in self.value and 'L' in self.value:
self.value=infinity
else:
self.value=float(self.value) * {'M':1e6,
'K':1e3,
' ':1,
'm':1e-3,
'u':1e-6,
'n':1e-9,
'p':1e-12}[mult]
if self.sign=='-':
self.value=-self.value
self.string=data
def __repr__(self):
return "%s %s"%(self.string,self.unit) #self.value)
def __nonzero__(self):
return None!=self.mode
class MasMeter:
def __init__(self, port='/dev/ttyPROLIFIC'):
if not os.path.lexists(port):
port = '/dev/ttyS0'
self.s=serial.Serial(port=port, timeout=3.0,
baudrate=600, stopbits=2,
bytesize=serial.SEVENBITS)
try:
self.s.setDTR()
except:
print("Could not set DTR")
try:
self.s.setRTS(0)
except:
print("Could not clear RTS")
# self.s.setTimeout(1)
self.packet_len=14
self.packet=None
def flush(self):
self.s.flushInput()
def try_for_packet(self):
""" May return a None packet"""
self.s.write(b'\0'*14)
d=self.s.read(self.packet_len)
print("type d = ",type(d))
if len(d)==0: raise TimeoutError("is meter turned on?")
if len(d)<14: return False
#if len(d): print("read %d bytes"%len(d))
p=Packet()
while 1:
if len(d)>2*self.packet_len: return False
try:
p.load_data(d[-self.packet_len:])
return p
except ChecksumError:
d=d+self.s.read(1)
except LengthError:
return False
else:
return False
def get_packet(self, tries=-1):
while tries!=0:
p=self.try_for_packet()
if p: return p
tries-=1
def get_dc_voltage(self):
return self.get_specific_measurement('DC','V')
def get_specific_measurement(self, mode, units):
connected_printed=False
units_printed=False
while 1:
p=self.get_packet(10)
if p==None:
if not connected_printed:
print("Meter not connected?")
connected_printed=True
elif p.mode!=mode or not units in p.units:
if not units_printed:
print("Please set meter to %s %s"%(mode,units))
units_printed=True
else:
return p;
import time
if __name__=="__main__":
meter=MasMeter()
while 1:
p=meter.get_dc_voltage()
if p and None != p.value:
print(p.value)
else:
print("x")
sys.stdout.flush()
_______________________________________________
PLUG mailing list
[email protected]
http://lists.pdxlinux.org/mailman/listinfo/plug