62 lines
1.2 KiB
Python
62 lines
1.2 KiB
Python
"""Direct serial link"""
|
|
|
|
|
|
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"]
|