En realidad no estas abriendo ningún puerto
sg = serial.Serial()
a seria.Serial le necesitas pasar los parámetros, incluso el mismo DEBUG te informa que el puerto es igual a None
para que funcione deberías
sg = serial.Serial(port=self.port,baudrate=self.baudrate,timeout=self.timeout)
De igual forma no veo el porque del
super(Puerto, self).__init__()
No es necesario
Incluso en tu primera implementación el error estaba en
sg = serial.Serial(self, port, baudrate, timeout)Sería
sg = serial.Serial(port=self.port, baudrate=self.baudrate, timeout=self.timeout)
Esta es mi implementación
class Serial(RawDriver):
""" Define Serial printer """
def __init__(self, **kwargs):
"""
@param devfile : Device file under dev filesystem
@param baudrate : Baud rate for serial transmission
@param bytesize : Serial buffer size
@param timeout : Read/Write timeout
"""
if "devfile" in kwargs:
self.devfile = kwargs["devfile"]
else:
self.devfile = "/dev/ttyS0"
if "baudrate" in kwargs:
self.baudrate = int(kwargs["baudrate"])
else:
self.baudrate = 9600
if "bytesize" in kwargs:
self.bytesize = int(kwargs["bytesize"])
else:
self.bytesize = 8
if "timeout" in kwargs:
self.timeout = int(kwargs["timeout"])
else:
self.timeout = 1
#self.barcode = barcode
#self.dpi = 180
self.open()
def open(self):
""" Setup serial port and set is as escpos device """
self.device = serial.Serial(port=self.devfile, baudrate=self.baudrate, bytesize=self.bytesize, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=self.timeout, dsrdtr=True)
if self.device is not None:
print "Serial printer enabled"
else:
print "Unable to open serial printer on: %s" % self.devfile
class RawDriver(BaseDriver):
def __init__(self):
pass
def _raw(self,msg,end=True):
if hasattr(self.device,"write"):
self.device.write(msg)
elif hasattr(self.device,"send"):
self.device.send(msg)
class BaseDriver(object):
dtype = None #Driver type OSDriver, RawDriver
device = None
def open(self):
pass
def _raw(self,msg,end=True):
pass
def __del__(self):
if self.device:
self.device.close()
self.device = None
Probablemente uses el formato del primer código (adaptándolo a lo que necesitas). En mi aplicación lo hice de esa forma porque se pueden tener varias formas de comunicarse con el dispositivo en cuestión (Impresora ESC/POS), y no sólo por el puerto serie por lo que era necesario crear una misma interfaz para todas las formas en que se podría conectar, pero tentativamente tu código podría lucir como
class Serial(object):
device = None
def __init__(self, **kwargs):
"""
@param devfile : Device file under dev filesystem
@param baudrate : Baud rate for serial transmission
@param bytesize : Serial buffer size
@param timeout : Read/Write timeout
"""
if "devfile" in kwargs:
self.devfile = kwargs["devfile"]
else:
self.devfile = "/dev/ttyS0"
if "baudrate" in kwargs:
self.baudrate = int(kwargs["baudrate"])
else:
self.baudrate = 9600
if "bytesize" in kwargs:
self.bytesize = int(kwargs["bytesize"])
else:
self.bytesize = 8
if "timeout" in kwargs:
self.timeout = int(kwargs["timeout"])
else:
self.timeout = 1
#self.barcode = barcode
#self.dpi = 180
self.open()
def open(self):
""" Setup serial port and set is as escpos device """
self.device = serial.Serial(port=self.devfile, baudrate=self.baudrate, bytesize=self.bytesize, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=self.timeout)
if self.device is not None:
print "Serial printer enabled"
else:
print "Unable to open serial printer on: %s" % self.devfile
def send(self,msg):
self.device.write(msg)
def read(self,nBytes=1):
return self.device.read(nBytes);
def readline(self):
return self.device.readline()
def close(self):
if self.device is not None:
self.device.close()
self.device = None
def __del__(self):
self.close()
Y para usarlo
ser = Serial(devfile="/dev/ttyUSB0",baudrate=9600, bytesize=8)
ser.open()
ser.read()
ser.readline()
ser.close()