none
SERIALPORT EN TODOS LOS FORMULARIOS DEL PROYECTO EN VB2008 RRS feed

  • Pregunta

  • Saludos,
    He adjuntado el codigo de una clase que tengo desarrollada la cual me ha permitido manipular el puerto serial (serialport) desde un formulario, sin embargo cuando deseo controlar el puerto desde otro formulario que fué abierto desde el principal, me indica que es puerto no exite. Deseo utilizar esta clase en todos los formularios, para no declarar en cada una un puerto serial.
    Agradezco me pudiesen colaborar al respecto, gracias.
    ______________________________________________________________________________________________
    ______________________________________________________________________________________________
    using System;
    using System.Threading;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using Microsoft.Win32;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    namespace PROYECTO_2
    {
        public class COM_PUERTORS232
        {
            
            #region Manager Variables
            
            SerialPort RS232 = new SerialPort("COM1",115200,Parity.None,8,StopBits.One);
            
            #endregion
            #region Manager Constructors
            public COM_PUERTORS232()
            {
                RS232.DataReceived += new SerialDataReceivedEventHandler(RS232_DataReceived);
            }
            #endregion
            #region WriteData
            public void WriteData(string msg)
            {
                try
                {
                    if (!(RS232.IsOpen == true)) RS232.Open();
                    RS232.Write(msg);
     
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            #endregion
            
              
            #region OpenPort
            public bool OpenPort()
            {
                try
                {
                    if (RS232.IsOpen == true) RS232.Close();
                    RS232.Open();
                    return true;
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return false;
                }
            }
            #endregion
            #region ClosePort
            public bool ClosePort()
            {
                if (RS232.IsOpen == false) RS232.Dispose();
                else
                {
                    RS232.Close();
                    RS232.Dispose();
                }
                return true;
            }
            #endregion
            
            #region RS232_DataReceived
            void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string msg = RS232.ReadExisting();
            }
            #endregion
        }
            
    }
    martes, 1 de noviembre de 2011 19:53

Respuestas

  • Hola caudiz,

    Aparentemente con lo que estás mostrando no hay a primera vista ningún problema o muestras como la llamas desde el FormPrincipal y como cargas el resto de formularios y como utilizas esta clase en ellos o es difícil contestar a esta pregunta. Lo único que se me ocurre es que el puesto esté abierto y sin cerrarlo cuando llamas a otro desde el principal y en este segundo intentas abrirlo otra vez, esto te puede estar pasando, o lo que necesitas es pasar esta clase entre formularios, perdona que te haga este tipo de preguntas pero es que con lo que has pasado no se ve nada mal:)

    Saludos,


    phurtado
    • Marcado como respuesta caudiz miércoles, 9 de noviembre de 2011 17:09
    martes, 1 de noviembre de 2011 20:03
    Moderador
  • Hola caudiz,

    Perdona que te responda en esta otra respuesta pero se me paso una cosa.

    Tu dices que te aparece este error "me indica que es puerto no exite."

    string[] Ports = System.IO.Ports.SerialPort.GetPortNames();

    De esa forma puedes ver todos los puertos y comprobar si existe "COM1".

    La otra respuesta te puede ocasionar un error del tipo UnAutorizedAccesException.

    Es  sencillo reproducirla haciendo esto

     

                SerialPort port = new System.IO.Ports.SerialPort("COM1");
                SerialPort port2 = new System.IO.Ports.SerialPort("COM1");
                port.Open();
                port2.Open();
    

     

    port2.Open() genera este último error.

    Saludos,


    phurtado
    • Editado Pedro HurtadoModerator martes, 1 de noviembre de 2011 21:10
    • Marcado como respuesta caudiz miércoles, 9 de noviembre de 2011 17:09
    martes, 1 de noviembre de 2011 21:09
    Moderador
  • Saludos,
    Ahora vuelvo con otro inconveniente, resulta que necesito que la clase que llame desde cualquier formulario, pueda tambien capturar los datos que vienen por el puerto para ponerlos en un textbox y que se muestren seguido, asi como el hiperterminal, tengo la clase pero no he logrado idear la forma de recibir datos.
    A continuacion muestro la clase para manipulacion del puerto serial:
    _______________________________________________
    _______________________________________________
    using System;
    using System.Threading;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using Microsoft.Win32;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    namespace PROYECTO_2
    {
        public class COM_PUERTORS232
        {
            
            #region Manager Variables
            
            SerialPort RS232 = new SerialPort("COM1",115200,Parity.None,8,StopBits.One);
            
            #endregion
            #region Manager Constructors
            public COM_PUERTORS232()
            {
                RS232.DataReceived += new SerialDataReceivedEventHandler(RS232_DataReceived);
            }
            #endregion
            #region WriteData
            public void WriteData(string msg)
            {
                try
                {
                    if (!(RS232.IsOpen == true)) RS232.Open();
                    RS232.Write(msg);
     
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            #endregion
            
              
            #region OpenPort
            public bool OpenPort()
            {
                try
                {
                    if (RS232.IsOpen == true) RS232.Close();
                    RS232.Open();
                    return true;
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return false;
                }
            }
            #endregion
            #region ClosePort
            public bool ClosePort()
            {
                if (RS232.IsOpen == false) RS232.Dispose();
                else
                {
                    RS232.Close();
                    RS232.Dispose();
                }
                return true;
            }
            #endregion
            
            #region RS232_DataReceived
            void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string msg = RS232.ReadExisting();
            }
            #endregion
        }
            
    }
    • Marcado como respuesta caudiz miércoles, 9 de noviembre de 2011 17:09
    miércoles, 2 de noviembre de 2011 17:32
  • Hola,

    Se me ocurre una cosa, que es exponer en la clase una propiedad del tipo string que es la que asignas al TextBox y cargarla en el metodo RS232_DataReceived. Yo lo haría así.

    public class COM_PUERTORS232
        {
            
            #region Manager Variables
            
            SerialPort RS232 = new SerialPort("COM1",115200,Parity.None,8,StopBits.One);
    
            StringBuilder sb = new StringBuilder();
    
            #endregion
            #region Manager Constructors
            public COM_PUERTORS232()
            {
                RS232.DataReceived += new SerialDataReceivedEventHandler(RS232_DataReceived);
            }
            #endregion
            #region WriteData
            public void WriteData(string msg)
            {
                try
                {
                    if (!(RS232.IsOpen == true)) RS232.Open();
                    RS232.Write(msg);
     
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            #endregion
            
              
            #region OpenPort
            public bool OpenPort()
            {
                try
                {
                    if (RS232.IsOpen == true) RS232.Close();
                    RS232.Open();
                    return true;
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return false;
                }
            }
            #endregion
            #region ClosePort
            public bool ClosePort()
            {
                if (RS232.IsOpen == false) RS232.Dispose();
                else
                {
                    RS232.Close();
                    RS232.Dispose();
                }
                return true;
            }
            #endregion
            
            #region RS232_DataReceived
            void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                sb.Append(RS232.ReadExisting());
            }
            #endregion
    
    	public string Mensaje {get{return sb.ToString()}};
    }
    


    Fijate que defino un StringBuilder que es el que devuelvo en la propiedad Mensaje, después lo que tienes que hacer es 

    this.TextBox1.Text = COMM.Mensaje;

     

    Saludos,

     

     


    phurtado
    miércoles, 2 de noviembre de 2011 17:47
    Moderador
  • Hola,

    No me gusta el Timer, vamos a complicarnos un poco la cabeza. El código que te voy a pasar es como mínimo para FrameWork 3.5

    voy a cambiar la propiedad Mensaje para dejarla de esta forma.

    public Action<string> ActualizarMensaje{get;set;}

    en el Formulario donde quieres acualizar el TextBox haces lo siguiente, por ejemplo después del InicializeComponent().

    COMM.ActualizarMensaje = (a) =>

    {

    this.TextBox.Text =a;

    };

    y desde la clase vas a hacer lo siguiente.

     

     

     void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                sb.Append(RS232.ReadExisting());
    	   if (this.ActualizarMensaje!=null)
    		this.ActualizarMensaje(sb.ToString());
            }

     

    Revisa esta documentación  http://msdn.microsoft.com/es-es/library/018hxwa8.aspx

    Saludos,


    phurtado
    miércoles, 2 de noviembre de 2011 18:27
    Moderador

Todas las respuestas

  • Hola caudiz,

    Aparentemente con lo que estás mostrando no hay a primera vista ningún problema o muestras como la llamas desde el FormPrincipal y como cargas el resto de formularios y como utilizas esta clase en ellos o es difícil contestar a esta pregunta. Lo único que se me ocurre es que el puesto esté abierto y sin cerrarlo cuando llamas a otro desde el principal y en este segundo intentas abrirlo otra vez, esto te puede estar pasando, o lo que necesitas es pasar esta clase entre formularios, perdona que te haga este tipo de preguntas pero es que con lo que has pasado no se ve nada mal:)

    Saludos,


    phurtado
    • Marcado como respuesta caudiz miércoles, 9 de noviembre de 2011 17:09
    martes, 1 de noviembre de 2011 20:03
    Moderador
  • Gracias Pedro,

    Efectivamente, adjunto la forma como los llamo desde 2 formularios diferentes. Agradezco su colaboración.

     

    DESDE EL FORMULARIO 1, ESTE AL PULSAR UN BOTON LLAMA A OTRO FORMULARIO, EL No.2:

    ________________________________

    ________________________________

    using System;

     

    using System.Threading;

    using System.Collections;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using System.IO.Ports;

    using Microsoft.Win32;

    using System.Diagnostics;

    using System.Runtime.InteropServices;

     

     

    namespace PROYECTO_2

    {

        public partial class MENU : Form

        {

     

            int CTRL_BOTON;

            COM_PUERTORS232 COMM = new COM_PUERTORS232();

     

            //CARGA CANCION INICIAL

            PROYECTO_2.Sound sound;    

     

            public MENU()

            {

                InitializeComponent();

     

            }

     

     

     

            private void Form1_Load(object sender, EventArgs e)

            {

     

     

                BOTON1.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_1_s.png");

                BOTON2.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_2_s.png");

                BOTON3.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_3_s.png");

                BOTON4.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_4_s.png");

                BOTON5.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_5_s.png");

                BOTON6.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_6_s.png");

                BOTON7.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_7_s.png");

                BOTON8.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_8_s.png");

                BOTON9.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_9_s.png");

                BOTON10.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_10_s.png");

                BOTON11.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_11_s.png");

     

                //CARGA IMAGEN DE FONDO DE PRIMERA FORMA

                IMG_FONDO.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/IMAGEN_10.jpg");

     

                sound = new PROYECTO_2.Sound("/Storage Card/AutoRun/RECURSOS/stop.wav");

                sound.Play();

     

            }

     private void BOTON1_Click(object sender, EventArgs e)
            {
                CTRL_BOTON = 1;
                COMM.WriteData("OPCION 1\r\n"); //WriteData es la funcion que esta en la clase COM_PUERTORS232
                BOTON1.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/boton_1_p.png");
                t1.Enabled = true;
                
                MENU2 form2 = new MENU2(); //AQUI DECLARO A OTRO FORMULARIO, EL No.2
                form2.ShowDialog(); //AQUI LLAMO AL FORMULARIO 2
            }
    _____________________________________________________________
    _____________________________________________________________
    AHORA EL FORMULARIO 2:
    using System;
    using System.Threading;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using Microsoft.Win32;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    namespace PROYECTO_2
    {
        
        
        public partial class MENU2 : Form
        {
            int BOTON1, BOTON2, BOTON3, BOTON4, BOTON5, BOTON6, 
                BOTON7, BOTON8, BOTON9, BOTON10,BOTON11,BOTON12,
                BOTON13,BOTON14;
                COM_PUERTORS232 COMM = new COM_PUERTORS232();
            public MENU2()
            {
                InitializeComponent();
                    
            }
            private void PANTALLA1_Click(object sender, EventArgs e)
            {
                this.Close();
            }
                           
            private void MENU2_Load(object sender, EventArgs e)
            {
                
                BOTON1 = 0;//VENTANA BETHA
                BOTON2 = 0;//PUERTA DERECHA
                BOTON3 = 0;//VENTANA OMEGA1
                BOTON4 = 0;//VENTANA ALPHA
                BOTON5 = 0;//PUERTA IZQUIERDA
                BOTON6 = 0;//VENTANA GAMMA1
                BOTON7 = 0;//VENTANA GAMMA2
                BOTON8 = 0;//PUERTA ABAJO
                BOTON9 = 0;//VENTANA OMEGA2
                BOTON10 = 0;//PUERTA ARRIBA
                BOTON11 = 0;//PUERTA ALFA
                BOTON12 = 0;//PUERTA BETHA
                BOTON13 = 0;//PUERTA GAMMA
                BOTON14 = 0;//PUERTA OMEGA
                
                IMG_FONDO.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/PANTALLA_1.jpg");
                
                VENTANA_BETHA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_V.png");
                PUERTA_DERECHA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_V.png");
                VENTANA_OMEGA1.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_V.png");
                VENTANA_ALPHA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_V.png");
                PUERTA_IZQUIERDA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_V.png");
                VENTANA_GAMMA1.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_V.png");
                VENTANA_GAMMA2.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_H.png");
                PUERTA_ABAJO.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_H.png");
                VENTANA_OMEGA2.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_H.png");
                PUERTA_ARRIBA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_LIBRE_H.png");
                PUERTA_ALPHA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_CUAD_ABIE_LIBRE.png");
                PUERTA_BETHA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_CUAD_ABIE_LIBRE.png");
                PUERTA_GAMMA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_CUAD_ABIE_LIBRE.png");
                PUERTA_OMEGA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_CUAD_ABIE_LIBRE.png");
            }
            private void VENTANA_BETHA_Click(object sender, EventArgs e)
            {
                
                    COMM.WriteData("ABRIR VENTANA SALA BETHA\r\n");
                    VENTANA_BETHA.Image = (Image)new Bitmap("/Storage Card/AutoRun/RECURSOS/BTN_ABIERTO_PRES_V.png");
                    BOTON1 = 1;
                    T2.Enabled = true;
             }

    martes, 1 de noviembre de 2011 20:18
  • Hola caudiz,

    Fijate en estas lineas.

    1 . SerialPort RS232 = new SerialPort("COM1",115200,Parity.None,8,StopBits.One); 

    Esto lo tienes definido en la clase COM_PUERTORS232.

    2. En el FormPrincipal ejecutas esto   COM_PUERTORS232 COMM = new COM_PUERTORS232();

    3. Cuando desde el FormPrincipal creas una nueva instancia del formulario MENU2  

    MENU2 form2 = new MENU2(); //AQUI DECLARO A OTRO FORMULARIO, EL No.2

    y vuelves a ejecutar el punto 1.

    Puesto que MENU2 tiene esta linea COM_PUERTORS232 COMM = new COM_PUERTORS232(); (*)

    Este planteamiento no es correcto, puesto que  vas a trabajar con dos instancias diferentes sobre el mismo puerto y hasta donde yo se esto te va a dar problemas.

    Si necesitas pasarlo de un Formulario a otro podrías hacer esto en el formulario MENU2.

    definir una propiedad de esta forma;

    public COM_PUERTORS232 Puerto232{get;set;}

    y cuando llamas al Form MENU hacer lo siguiente


     MENU2 form2 = new MENU2(); //AQUI DECLARO A OTRO FORMULARIO, EL No.2
    fomr2.Puerto232  = this.COMM;
                form2.ShowDialog();
    

    Saludos,

     






    phurtado
    martes, 1 de noviembre de 2011 20:57
    Moderador
  • Hola caudiz,

    Perdona que te responda en esta otra respuesta pero se me paso una cosa.

    Tu dices que te aparece este error "me indica que es puerto no exite."

    string[] Ports = System.IO.Ports.SerialPort.GetPortNames();

    De esa forma puedes ver todos los puertos y comprobar si existe "COM1".

    La otra respuesta te puede ocasionar un error del tipo UnAutorizedAccesException.

    Es  sencillo reproducirla haciendo esto

     

                SerialPort port = new System.IO.Ports.SerialPort("COM1");
                SerialPort port2 = new System.IO.Ports.SerialPort("COM1");
                port.Open();
                port2.Open();
    

     

    port2.Open() genera este último error.

    Saludos,


    phurtado
    • Editado Pedro HurtadoModerator martes, 1 de noviembre de 2011 21:10
    • Marcado como respuesta caudiz miércoles, 9 de noviembre de 2011 17:09
    martes, 1 de noviembre de 2011 21:09
    Moderador
  • Saludos Pedro,

     

    He probado la solucion que me has enviado y efectivamente funciono a la perfección. Solo modifiqué los parámetros que me indicaste y sirvió. Me enviaste otra respuesta respecto a un error que podría generarse, pero hasta el momento no ha sucedido nada extraño, ha trabajado muy bien.

     

    Muchas gracias por tu ayuda.

    martes, 1 de noviembre de 2011 21:14
  • Saludos,
    Ahora vuelvo con otro inconveniente, resulta que necesito que la clase que llame desde cualquier formulario, pueda tambien capturar los datos que vienen por el puerto para ponerlos en un textbox y que se muestren seguido, asi como el hiperterminal, tengo la clase pero no he logrado idear la forma de recibir datos.
    A continuacion muestro la clase para manipulacion del puerto serial:
    _______________________________________________
    _______________________________________________
    using System;
    using System.Threading;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using Microsoft.Win32;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    namespace PROYECTO_2
    {
        public class COM_PUERTORS232
        {
            
            #region Manager Variables
            
            SerialPort RS232 = new SerialPort("COM1",115200,Parity.None,8,StopBits.One);
            
            #endregion
            #region Manager Constructors
            public COM_PUERTORS232()
            {
                RS232.DataReceived += new SerialDataReceivedEventHandler(RS232_DataReceived);
            }
            #endregion
            #region WriteData
            public void WriteData(string msg)
            {
                try
                {
                    if (!(RS232.IsOpen == true)) RS232.Open();
                    RS232.Write(msg);
     
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            #endregion
            
              
            #region OpenPort
            public bool OpenPort()
            {
                try
                {
                    if (RS232.IsOpen == true) RS232.Close();
                    RS232.Open();
                    return true;
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return false;
                }
            }
            #endregion
            #region ClosePort
            public bool ClosePort()
            {
                if (RS232.IsOpen == false) RS232.Dispose();
                else
                {
                    RS232.Close();
                    RS232.Dispose();
                }
                return true;
            }
            #endregion
            
            #region RS232_DataReceived
            void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string msg = RS232.ReadExisting();
            }
            #endregion
        }
            
    }
    • Marcado como respuesta caudiz miércoles, 9 de noviembre de 2011 17:09
    miércoles, 2 de noviembre de 2011 17:32
  • Hola,

    Se me ocurre una cosa, que es exponer en la clase una propiedad del tipo string que es la que asignas al TextBox y cargarla en el metodo RS232_DataReceived. Yo lo haría así.

    public class COM_PUERTORS232
        {
            
            #region Manager Variables
            
            SerialPort RS232 = new SerialPort("COM1",115200,Parity.None,8,StopBits.One);
    
            StringBuilder sb = new StringBuilder();
    
            #endregion
            #region Manager Constructors
            public COM_PUERTORS232()
            {
                RS232.DataReceived += new SerialDataReceivedEventHandler(RS232_DataReceived);
            }
            #endregion
            #region WriteData
            public void WriteData(string msg)
            {
                try
                {
                    if (!(RS232.IsOpen == true)) RS232.Open();
                    RS232.Write(msg);
     
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            #endregion
            
              
            #region OpenPort
            public bool OpenPort()
            {
                try
                {
                    if (RS232.IsOpen == true) RS232.Close();
                    RS232.Open();
                    return true;
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return false;
                }
            }
            #endregion
            #region ClosePort
            public bool ClosePort()
            {
                if (RS232.IsOpen == false) RS232.Dispose();
                else
                {
                    RS232.Close();
                    RS232.Dispose();
                }
                return true;
            }
            #endregion
            
            #region RS232_DataReceived
            void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                sb.Append(RS232.ReadExisting());
            }
            #endregion
    
    	public string Mensaje {get{return sb.ToString()}};
    }
    


    Fijate que defino un StringBuilder que es el que devuelvo en la propiedad Mensaje, después lo que tienes que hacer es 

    this.TextBox1.Text = COMM.Mensaje;

     

    Saludos,

     

     


    phurtado
    miércoles, 2 de noviembre de 2011 17:47
    Moderador
  • Saludos Pedro,

    Efectivamente, use lo que me sugeriste, y funciona muy bien. Solo fué cuestion de agregar un timer en el formulario para que cada instante de tiempo actualice el textbox. Muchas gracias por tu colaboracion.

    miércoles, 2 de noviembre de 2011 18:15
  • Hola,

    No me gusta el Timer, vamos a complicarnos un poco la cabeza. El código que te voy a pasar es como mínimo para FrameWork 3.5

    voy a cambiar la propiedad Mensaje para dejarla de esta forma.

    public Action<string> ActualizarMensaje{get;set;}

    en el Formulario donde quieres acualizar el TextBox haces lo siguiente, por ejemplo después del InicializeComponent().

    COMM.ActualizarMensaje = (a) =>

    {

    this.TextBox.Text =a;

    };

    y desde la clase vas a hacer lo siguiente.

     

     

     void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                sb.Append(RS232.ReadExisting());
    	   if (this.ActualizarMensaje!=null)
    		this.ActualizarMensaje(sb.ToString());
            }

     

    Revisa esta documentación  http://msdn.microsoft.com/es-es/library/018hxwa8.aspx

    Saludos,


    phurtado
    miércoles, 2 de noviembre de 2011 18:27
    Moderador