VB 2008 SerialPort

Iniciado por 01munrra, 31 Julio 2019, 15:05 PM

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

01munrra

Saludos!

Compañeros estoy ralizando un aplicacion en VB 2008 en la cual tengo mas de 4 formularios y en cada formulario estoy obteniendo los datos a traves de un dispositivo via usb, entonces estoy usando serialport para la lectura de diferentes sensores que tengo, y como no puedo estar leyendo el puerto en cada formulario, ya que me generaría un error, quisiera saber si me convendría hacerlo las lecturas añadiendo un Modulo al proyecto, y de ser asi como hacerlo?

Serapis

#1
De entrada este no es el for para VB.NET si no el de VB 6.0, peor bueno, ya lo moverá algún admin si se percata...


Creas una clase y que sea la clase la que haga todo el trabajo de lectura.

La clase ha de tener una única instancia, luego... debe ser creada en un módulo (de forma privada), y tener una propiedad pública para obtener acceso a la instancia. Así cada formulario logra acceso a la misma, previo registro.

El registro de cada formulario sobre la clase, es para identificar cuantos consumidores de datos tiene la clase y si es posible, derivar el contenido únicamente al consumidor final. Esto es, la clase debe mantener una colección de objetos a los que lanzar algún evento.

...de modo informal y rápido (en pseudocodigo):


' Esta sería la clase de la que se crea una sola instancia y que realiza todo el trabajo de lectura del puerto... e informa a los consumidores 'registrados'.
' Esta clase debe declararse como pública pero no creable desde fuera.
Clase SerialRead

   coleccion de clsInformation colInformation
   Evento DataReceived(bytes() Data)

   buleano = funcion Registro(c tipo clsInformation)
      si colInformation.Contains(c)= false luego
          colInformation.Add(c, c.Id)
          devolver TRUE
      fin si
   fin funcion

   ' digamos que esto representa la lectura de datos del puerto...
   sub SerialReaded(data)
       si data.Id <> "" luego
           clsInformation c = colInformation.Search(data.Id, encontrado)
           Si encontrado=true
               c.Data = data    ' al asignar los datos, dicha clase dispara su evento... Datareceived, etc...
           sino
               ' parece que ninguna clase REGISTRADA fuera el destino de los datos leídos???
           fin si
       sino
           ' los datos leídos no contienen info del destino de los mismos.
           ' en tal caso decidir que hacer, una posible solución es asumir que es para todos (o para ninguno, claro)...
           'Por cada c en clasInformation   ' se informa a todos... ya cada uno debería saber si debe o no fitrarlo.
           '    c.Data = Data
           'siguiente

           ' pero para informar a todos es mucho mejor usar en evento de la clase que es instancia única. así informa a todos de una vez, (es imposible saber el orden, si el orden de llamada es importante, usar mejor la forma del bucle.
           DispararEvento DataReceived(data)  
       fin si  
   fin sub

   buleano = Funcion Desregistrar( string Id)
       colInformation.Search(Id, encontrado)
       Si encontrado luego
            colInformation.Delete(Id)
            devolver TRUE
       fin si
       ' Si no se precisa devolver info sobre su eliminación, puede invocarse duirectamente  'delete', si existe se elimina y si no no, como no hay que informar del resultado sobra el resto del código.

        ' Opcionalmente si una clase así consume muchos recursos podría ser autoeliminada cuando no tenga consumidores registrados... ya con nuevos registros se creará si no existe.
       'si colInformation.Count = 0 luego ME = nada   ' Me en el sentido de VB otorga a Me, la referencia al objeto donde se está.  ...el equivalente para los 'C'dores y 'Javaneses' es 'This'...      
   fin funcion
fin clase

Esto sería básicamente el código de la clase que opera leyendo... es decir mantiene una colección donde registra consumidores a los que informa debidamente cuando lea... además de forma asíncrona, esto es cuando se lean... sin las exigencias de las prisas 'dame algo si lo tienes'... (cuando llega se entrega y al destinatario adecuado si es conforme que pueda ser así).

OJO: No confundir colInformation con las instancias de clsInformation, ni sus métodos.
colInformation es una clase de tipo colección, que como cualquier colección tendrá los típicos métodos Add, Delete, Search, Contains, etc... vamos para añadir, eliminar y buscar. Y al menos que pueda buscarse por un string o un entero, luego dicha clase no requiere más descripciones, son genéricas.
En cambio las instancias de clsInformation son otro objeto distinto, que se describe más abajo y su única relación con colInformation es que dichas instancias son guardadas ahí, lo mismo que un array de bytes guardaría bytes, pero el byte y el array son dos tipos distintos.

Por su parte el módulo sería más o menos crear la única instancia de la clase y entregarla a cada uno que la solicite.
Su único cometido es que como nadie fuera de l ámbito d ela clase puede crear instancias de la clase, creara él, una única instancia y entregar referencia de la misma a qien la solicite si pudo registrarse.

Modulo Repartidor
   privado SerialRead cLector

   SerialRead = propiedad get Lector(clsInformation ci)
       Si cLector no existe luego
           clector = nueva SerialRead
       Sino
           si cLector.Registro(ci, ci.Id) = false devolver nada  ' si no pudo registrarse es porque ya está registrado.
       fin si
       devolver cLector
   fin propiedad
fin modulo


La clase clsInformation tampoco tiene mucha miga, es sólo una clase con 1 constructor, y 2 métodos/propiedades y un evento. Cuando se reciben datos dispara su evento para entregarlos a quien creó su instancia.
La otra propiedad (Id) identifica únivocamente a una instancia (solo es preciso si la clase lectora está capacitada para determinar el destino de los datos. Y por tanto, si procede quizás el ID, en vez de ser aleatorio debe tener una cadena fija establecida desde e lprincipio (incluso desde código) conocida por todos, esto básicamente una enumeración...).

clase clsInformation
   string s_Id
   Evento Datareceived(bytes() Data)


   Propiedad Set Data(bytes() d)
        DispararEvento DataReceived(d)
   fin propiedad

   String = propiedad Get Id
        devolver s_Id
   fin propiedad

   ' Cuando se crea una instancia debe asignarse un identificador en lo posible único...
   funcion Nuevo(string IdName)
        Si IdName.Lenght = 0 luego IdName= RandomString(16 chars)
        s_Id = idName
   fin funcion
fin clase


Finalmente tus formularios tendrían un código similar a:
(vamos lo necesario para tratar con los objetos desceritos antes)

Class formulario
    clsInformation mInformation       enganchado a sus eventos
    serialRead mRead                      enganchado a sus eventos

    funcion Nuevo
        Hacer
            ' crea una instancia de dicha clase y le asigna el id que usará.
            '   parte del id, es aleatorio, para evitar coincidencia con existentes y en caso contrario nuevos reintentos, podrían dar positivo...
            mInformation = Nuevo clsInformation(randomstring(8 chars) + form.name)
            mRead = Repartidor.Lector(mInformation)    
        repetir mientras (mRead = nada)
    fin funcion

    Funcion Terminar
        mRead.Desregistrar(mInformation.Id)
        mRead = nada
        mInformation = nada
   fin funcion

   ' este evento se dispara cuando éste objeto sea el único consumidor destinatario d edichos datos (si así es preciso y está establecdio en la clase lectora, claro)
   funcion mInformation_DataReceived(bytes() Data)
      ' lo que tengas que hacer con los datos
   fin funcion

   ' este evento se recibirá cuando los mismos datos sean enviados a todos los destinatarios.
   funcion mRead_DataReceived(bytes() Data)
      ' lo que tengas que hacer con los datos
   fin funcion
fin clase


...seguramente al 100% no podrás aplicarlo, ya que has sido parco en descripciones, es imposible acertar a darte la solución que se adapta al 100% sin cambios con tus necesidades.
Sin embargo ofrece la suficiente info, como para entender que cambios son precisos hacer para adaptarlo a tus necesidades.
El resto es trabajo tuyo...

01munrra

Joder NEBIRE me a servido de mucho tu explicación, me has respondido un par de dudas que tenia y no la había posteado, mil gracias!!  ;-)