"""Direct serial link""" from __future__ import absolute_import import serial import serial.tools.list_ports as lp from binascii import hexlify from .base import BaseLink, LinkTimeoutException, LinkOpenException class SerialLink(BaseLink): def __init__(self, *args, **kwargs): super(SerialLink, self).__init__(*args, **kwargs) self.com = None def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): self.close() def scan(self): ports = lp.comports() res = [("%s %04X:%04X" % (port.device, port.vid, port.pid), port.device) for port in ports] return res def open(self, port): try: self.com = serial.Serial(port, 115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=self.timeout) except serial.SerialException: raise LinkOpenException def close(self): if self.com: self.com.close() self.com = None def read(self, size): try: data = self.com.read(size) except serial.SerialTimeoutException: raise LinkTimeoutException if len(data)<size: raise LinkTimeoutException if self.dump: print "<", hexlify(data).upper() return data def write(self, data): if self.dump: print ">", hexlify(data).upper() self.com.write(data) __all__ = ["SerialLink"]