class Dmm: """ Takes readings off the serial port from a class of multimeters that includes the TekPower TP4000ZC (the meter I own) and supposedly is the same as the the 'VC820' mode in QtDMM.
example code: # load the module import tp4000zc # the port that we're going to use. This can be a number or device name. # on linux or posix systems this will look like /dev/tty2 or /dev/ttyUSB0 # on windows this will look something like COM3 port = '/dev/ttyUSB0' # get an instance of the class dmm = tp4000zc.Dmm(port) # read a value val = dmm.read() print val.text # print the text representation of the value # something like: -4.9 millivolts DC print val.numericVal # and the numeric value # ie: -0.0048 # recycle the serial port dmm.close() Public Interface: __init__(port, retries=3, timeout=3.0): Instantiating the class attempts to open the serial port specified, initialize it and read enough from the serial port to synchronize the module with the start/end of a full reading. read(): Attempt to get a complete reading off of the serial port, parse it and return an instance of DmmValue holding the interpretted reading. close(): Finally you can close the serial port connection with close() Exceptions will be raised if * PySerial raises an exception (SerialException or ValueError) * this module can't get a full reading that passes initial data integrity checks (subclasses of DmmException) * I made a coding error (whatever python might throw) If no exceptions are raised the DmmValue might still fail various sanity checks or not have a numeric value. Ie I believe that showing multiple decimal points makes no sense but is valid per the protocol so no exception is raised but the saneValue flag will be set to False in the DmmValue. Meter Documentation: Per the documentation page, the meter spits out readings which are bursts of 14 bytes every .25 seconds. The high nibble of each byte is the byte number (1-14) for synchronization and sanity checks, the low nibble holds the data. Each data bit represents an individual field on the LCD display of the meter, from segments of the 7 segment digits to individual flags. Bytes 1 and 10-14 are flags (with four bits reserved/unmapped on this meter) and bytes (2,3), (4,5), (6,7) and (8,9) representing the individual digits on the display. For the digits, if the high bit of the first nibble of a digit is set then the negative sign (for the first digit) or the leading decimal point is turned on. the remaining bits of the two nibbles represent the elements of the 7 segment digit display as follows: pos 1 nibble 1: S123 p p nibble 2: 4567 o o where S is either the sign or decimal bit. s s 2 7 The legal values of the segment bits are represented in pos 6 digitTable and include the digits 0-9 along with blank and p p 'L'. o o s s 3 5 pos 4 Serial settings for this meter are: 2400 baud 8N1 """
class DmmValue: """ This is a representation of a single read from the multimeter.
Attributes in rough order of usefulness: Sanity checks: saneValue: True if no sanity checks failed. High level computed fields: text: Nicely formatted text representation of the value. numericVal: numeric value after SI prefixes applied or None if value is non-numeric. measurement: what is being measured. delta: True if the meter is in delta mode. ACDC: 'AC', 'DC' or None. readErrors: Number of failed reads attempts before successfully getting a reading from the meter. Other, possibly useful, computed fields: val: cleaned up display value scale: SI prefix for val Unprocessed values: rawVal: Numeric display flags: Various flags modifying the measurement scaleFlags: SI scaling factor flags measurementFlags: Flags to specify what the meter is measuring reservedFlags: Flags that are undefined rawBytes: the raw, 14 byte bitstream that produced this value. """