#!/usr/bin/env python3 import serial import json import re class Usv(object): def __init__(self, device, baudrate, json_file): self._serial_port = serial.Serial(device, baudrate=baudrate, timeout=10) # force a clean prompt self._serial_port.write(b"\r") self._read_until_prompt() #print("cleaned prompt") with open(json_file) as fhandle: self.json_params = json.load(fhandle) def _read_until_prompt(self): # match on "\n=>" prompt = False inbuf = [] while not prompt: inbuf.append(self._serial_port.read(1)) if len(inbuf) > 2: if inbuf[-3] == b"\n" and \ inbuf[-2] == b"=" and inbuf[-1] == b">": prompt = True return inbuf def get_parameters(self): # [{'name': 'acvoltsin', 'index': 1}, results = {} for parameter in self.json_params: outbuf = "d %s\r" % parameter['num'] self._serial_port.write(outbuf.encode()) inbuf = self._read_until_prompt() sbuf = "" for char in inbuf: sbuf += char.decode("utf-8") #print("-->%s<--" % sbuf) regex = parameter['regex'] match = re.search(regex, sbuf, re.MULTILINE) if match: name = parameter['name'] value = float(match.group(1)) results.setdefault(name, value) #print("MATCH: %s: %f" % (name,value)) return results if __name__ == "__main__": import pprint usv = Usv("/dev/ttyU0", 600, "usv_param.json") parameters = usv.get_parameters() pprint.pprint(parameters)