elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  VB 2008 SerialPort
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: VB 2008 SerialPort  (Leído 2,460 veces)
01munrra

Desconectado Desconectado

Mensajes: 282



Ver Perfil
VB 2008 SerialPort
« en: 31 Julio 2019, 15:05 pm »

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?


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.355


Ver Perfil
Re: VB 2008 SerialPort
« Respuesta #1 en: 31 Julio 2019, 16:47 pm »

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):

Código:
' 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.
Código:
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...).
Código:
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)
Código:
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...


« Última modificación: 31 Julio 2019, 17:06 pm por NEBIRE » En línea

01munrra

Desconectado Desconectado

Mensajes: 282



Ver Perfil
Re: VB 2008 SerialPort
« Respuesta #2 en: 31 Julio 2019, 17:19 pm »

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!!  ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
C# System.IO.Port SerialPort
Hacking Mobile
hoofmen 8 23,069 Último mensaje 31 Mayo 2009, 10:33 am
por Jubjub
Configuración serialPort en C#
.NET (C#, VB.NET, ASP)
Meta 0 2,318 Último mensaje 7 Diciembre 2008, 05:32 am
por Meta
SerialPort y Modem ?
.NET (C#, VB.NET, ASP)
TrashAmbishion 0 2,039 Último mensaje 27 Enero 2013, 23:43 pm
por TrashAmbishion
Problemita usando el SerialPort ?
.NET (C#, VB.NET, ASP)
TrashAmbishion 0 1,609 Último mensaje 5 Junio 2013, 00:26 am
por TrashAmbishion
Lectura de MiFare con SerialPort
.NET (C#, VB.NET, ASP)
Blakmaller 0 1,943 Último mensaje 24 Noviembre 2014, 14:54 pm
por Blakmaller
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines