You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.5 KiB
Python

from serial import Serial
from math import inf
import sys
#import binascii
def crap_to_number(num, unit, acdc, include_unit):
number_str = ""
if(num[0]&0x10):
number_str+="-"
num[0] &= 0xEF
for elem in num:
if(elem & 0x10 != 0):
number_str+="."
switch={
0xcf:"9",
0xef:"8",
0x8a:"7",
0xe7:"6",
0xc7:"5",
0x4e:"4",
0x8f:"3",
0xad:"2",
0x0a:"1",
0xeb:"0",
0x61:"L",
0x00:" "
}
number_str+=switch.get(elem&0xEF, "-")
if(include_unit):
if (unit[0] & 0x1):
number_str+="µ"
if (unit[0] & 0x2):
number_str+="n"
if (unit[0] & 0x4):
number_str+="k"
if (unit[1] & 0x1):
number_str+="m"
if (unit[1] & 0x2):
number_str+="%"
if (unit[1] & 0x4):
number_str+="M"
if (unit[2] & 0x1):
number_str+="F"
if (unit[2] & 0x2):
number_str+="Ω"
if (unit[3] & 0x1):
number_str+="A"
if (unit[3] & 0x2):
number_str+="V"
if (unit[3] & 0x4):
number_str+="Hz"
if (unit[4] & 0x2):
number_str+="°C"
if (unit[4] & 0x1):
number_str+="°F"
if(acdc&0xb == 0x0a):
number_str+=" DC"
if(acdc&0xb == 0x09):
number_str+=" AC"
return number_str
def read_peaktech(ser, include_unit=True):
line = ser.read_until( b'\xf1' )
#print(binascii.hexlify(line))
good=1
if(len(line) == 15):
for i in range(0, 0xf):
if i+1 != ((line[i]&0xF0)>>4):
good=0
else:
line = ser.read_until( b'\xf1' )
bytearr = bytearray(line)
if(good==1):
for i in range(0, 0xf):
bytearr[i] = (bytearr[i] & 0x0F)
#print(binascii.hexlify(bytearr))
acdc = bytearr[0]
num = []
num.append((bytearr[1]<<4) | bytearr[2])
num.append((bytearr[3]<<4) | bytearr[4])
num.append((bytearr[5]<<4) | bytearr[6])
num.append((bytearr[7]<<4) | bytearr[8])
unit = []
unit.append(bytearr[9] )
unit.append(bytearr[10])
unit.append(bytearr[11])
unit.append(bytearr[12])
unit.append(bytearr[13])
#print(unit[0])
#print(unit[1])
#print(unit[2])
#print(unit[3])
#print(unit[4])
return crap_to_number(num, unit, acdc, include_unit)
def read():
ser = Serial("/dev/ttyUSB0", 2400)
res = read_peaktech(ser, False)
try:
res = int(res)
except:
res = 0
return res
if __name__ == "__main__":
port = "/dev/ttyUSB0"
if len(sys.argv) > 1:
port = sys.argv[1]
try:
with Serial( port , 2400) as ser:
print(ser.name)
while True:
print(read_peaktech(ser))
except KeyboardInterrupt:
pass
except Exception as ex:
print( "Exception:", ex )