Autor Tema: Dudas con escribir codigo  (Leído 8790 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #30 en: 05 de Septiembre de 2016, 15:14:00 »
Alguien puede decirme donde estoy fallando en el código de esta clase:
Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: iso-8859-15 -*-
  3.  
  4.  
  5. import serial
  6. import sys
  7.  
  8.  
  9. #-----------------------
  10. #-- Mostrar la ayuda
  11. #-----------------------
  12. #def help():
  13.  
  14.  
  15. #----------------------------
  16. #-- Configurar puerto SCI
  17. #----------------------------
  18. class PortSerial(object):
  19.        
  20.         def __init__(self, port, baudrate, timeout):
  21.                 self.port = port
  22.                 self.baudrate = baudrate
  23.                 self.timeout = timeout
  24.  
  25.                 try:
  26.                         sg = serial.Serial(self, port, baudrate, timeout)
  27.  
  28.                 except serial.SerialException:
  29.                         #--Error al abrir el puerto serie
  30.                         sys.stderr.write('Error al abrir el puerto...')
  31.                         sys.exit(1)
  32.                         sg.close()  #-- Cerrar puerto serie
  33.  
  34.                 print(('\n' + self.port + ' is open...'))
  35.                 print(('baudrate: ' + str(self.baudrate) + ' baud'))
  36.                 print(('timeout: ' + str(self.timeout) + ' second'))

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #31 en: 07 de Septiembre de 2016, 18:26:30 »
Sigo probando y nada que no consigo abrir el puerto, alguna idea.
Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: utf-8 -*-
  3.  
  4. import serial
  5. #import sys
  6.  
  7.  
  8. class Puerto(object):
  9.  
  10.     def __init__(self, port, baudrate, timeout):
  11.         super(Puerto, self).__init__()
  12.         self.port = port
  13.         self.baudrate = baudrate
  14.         self.timeout = timeout
  15.  
  16.     def open_port(self):
  17.         try:
  18.             sg = serial.Serial()
  19.             print(('DEBUG: ' + str(sg)))
  20.  
  21.         except serial.SerialException:
  22.             print(('Error al abrir el puerto ' + self.port))
  23.  
  24.     def msg(self):
  25.         print(('\n' + self.port + ' is open...'))
  26.         print(('baudrate ' + str(self.baudrate)))
  27.         print(('timeout ' + str(self.timeout)))

Para probarlo hago lo siguiente igual me equivoco:
Código: Python
  1. from prueba_clase import*
  2. puerto = Puerto('/dev/ttyUSB0', 9600, 1.0)
  3. puerto.open_port()

y este es el resultado:
Código: Python
  1. DEBUG: Serial<id=0x7ff6a6dbef98, open=False>(port=None, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Dudas con escribir codigo
« Respuesta #32 en: 07 de Septiembre de 2016, 21:00:35 »
...
y este es el resultado:
Código: Python
  1. DEBUG: Serial<id=0x7ff6a6dbef98, open=False>(port=None, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

Saludos!

La verdad que no tengo idea de python, no esta en mi repertorio, pero lo único que se me ocurre que pueda fallar no relacionado con eso es que te esté faltando algún permiso para manejar el puerto.
Por una de esas casualidades: ¿hiciste ya una regla en /etc/udev/rules.d con el VID y PID del dispositivo?.
Podés verificar enchufando y haciendo
ls -l /dev/ttyUSB0 a ver que grupo tiene permisos, y si tiene permisos r/w.

Si ya verificaste eso, listo, es lo único que puedo aportar de mi parte  :?
Saludos

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #33 en: 08 de Septiembre de 2016, 03:10:33 »
Gracias colotron por tu respuesta, el puerto ya lo hice funcionar pero sin hacerlo con la programación orientada a objetos, mas bien creo que me esta faltando algo en la clase pero no se lo que es, haber si alguien con mas sabiduría nos dice  el qué.

Gracias
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Dudas con escribir codigo
« Respuesta #34 en: 08 de Septiembre de 2016, 10:56:02 »
Estoy viendo la intro de pyserial:
https://github.com/pyserial/pyserial/blob/master/documentation/shortintro.rst

Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: utf-8 -*-
  3.  
  4. import serial
  5. #import sys
  6.  
  7.  
  8. class Puerto(object):
  9.  
  10.     def __init__(self, port, baudrate, timeout):
  11.         super(Puerto, self).__init__()
  12.         self.port = port
  13.         self.baudrate = baudrate
  14.         self.timeout = timeout
  15.  
  16.     def open_port(self):
  17.         try:
  18.             sg = serial.Serial()
  19.             print(('DEBUG: ' + str(sg)))
  20.  
  21.         except serial.SerialException:
  22.             print(('Error al abrir el puerto ' + self.port))
  23.  
  24.     def msg(self):
  25.         print(('\n' + self.port + ' is open...'))
  26.         print(('baudrate ' + str(self.baudrate)))
  27.         print(('timeout ' + str(self.timeout)))

Para probarlo hago lo siguiente igual me equivoco:
Código: Python
  1. from prueba_clase import*
  2. puerto = Puerto('/dev/ttyUSB0', 9600, 1.0)
  3. puerto.open_port()

y este es el resultado:
Código: Python
  1. DEBUG: Serial<id=0x7ff6a6dbef98, open=False>(port=None, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

Y me parece que la secuencia de apertura está mal. Es decir, en tu constructor seteas baud, nombre de puerto, etc como variables internas de la clase, pero no veo donde se las seteas al objeto serial de la clase.
Observá que el mensaje de DEBUG dice port=None. Te faltaría por lo menos hacer un
sg.port = puerto

Por otro lado... donde queda almacenada la instancia serial sg?, no entiendo mucho de python pero no estarás confundiendo tu clase propia con la clase que ya viene implementada en pyserial?.

Yo intentaría empezar sin definir una clase propia, usando una instancia de serial y nada más. Después una vez comprobado eso hago mi clase propia a gusto.
Mi intento sería:

Código: [Seleccionar]
import serial

#Abrir puerto, default = 9600,8,N,1.
#Al pasarle puerto ya hace el open?, si no le paso nada no lo hace?
ser = serial.Serial('/dev/ttyUSB0')  # open serial port
print(ser.name)         # check which port was really used

#Escribir puerto
ser.write(b'hello')     # write a string

#Leer
x = ser.read()          # read one byte
s = ser.read(10)        # read up to ten bytes (timeout)
line = ser.readline()   # read a '\n' terminated line

#Cerrar
ser.close()             # close port

#Ahora que está cerrado es seguro cambiar baudrate, paridad, etc
#No cambiaría esos parámetros mientras el puerto está abierto, por las dudas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #35 en: 08 de Septiembre de 2016, 12:58:56 »
Hola colotron así como lo planteas ya lo tengo resuelto sin ningún problema, el problema lo tengo con el otro código.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Dudas con escribir codigo
« Respuesta #36 en: 08 de Septiembre de 2016, 14:41:12 »
En realidad no estas abriendo ningún puerto

Código: [Seleccionar]
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

Código: [Seleccionar]
sg = serial.Serial(port=self.port,baudrate=self.baudrate,timeout=self.timeout)

De igual forma no veo el porque del
Código: [Seleccionar]
super(Puerto, self).__init__()
No es necesario

Incluso en tu primera implementación el error estaba en

Código: [Seleccionar]
sg = serial.Serial(self, port, baudrate, timeout)Sería
Código: [Seleccionar]
sg = serial.Serial(port=self.port, baudrate=self.baudrate, timeout=self.timeout)
Esta es mi implementación

Código: [Seleccionar]
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

Código: [Seleccionar]
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)

Código: [Seleccionar]
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

Código: [Seleccionar]
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

Código: [Seleccionar]
ser = Serial(devfile="/dev/ttyUSB0",baudrate=9600, bytesize=8)
ser.open()
ser.read()
ser.readline()
ser.close()

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #37 en: 09 de Septiembre de 2016, 03:15:26 »
 :-/ :-/ :-/ :-/ :-/ :-/  Muchísimas gracias tsk por la solución, aunque desde un principio pensé que el error era que algo me faltaba en el código, por mucho que lo miraba y probaba cosas no daba con el, de nuevo muchas gracias.

Saludos!

Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.