none
Leer puerto serie RRS feed

  • Pregunta

  • ¡¡¡Hola!!!

    Quiero leer con un button, el componente serialPort1.BaudRate = 9600; . Si lo pongo así, al pulsar el botón que se muestre los valores en un label.

    ¿Cómo hago para que se muestre los baudios que tengo configurado?

    Tenía pensado en almacenarlo en una variable y de esa variable pasarlo al label alpulsar un button, si hay otro remedio mejor, mejor que mejor.

    Hasta otra campeones.

Respuestas

  • Ya lo descubrí:

    label_bits_por_segundo_02.Text = serialPort1.BaudRate.ToString();
    Hasta otra.

    EDITO :
    Ahora que me doy cuenta, no se coger el Bit de paridad. ¿Cómo lo hago?

    Saluo.
    sábado, 15 de agosto de 2009 17:19
  • hola,

    estas utilizando las clases de System.IO.Ports ?
    o sea la clase SerialPort

    si es asi tienes la orpiedad que te da esa info SerialPort.Parity

    por supuesto este devuelve una enumeracion Parity (Enumeración)

    lblParity.Text = serialPort1.Parity.ToString();
    si lo haces de esta forma obtendras la descripcion del enum, o sea el valor en ingles.
    si lo igualas a int, obtendras el valor numero del enumerado

    pero podrias hacer un switch

    switch(serialPort1.Parity)
    {
        case Parity.Even:
          lblParity.Text = "Par";
          break;
        case Parity.Mark:
          lblParity.Text = "Paridad 1";
          break;
        case Parity.None:
          lblParity.Text = "Ninguna";
          break;
        case Parity.Odd:
          lblParity.Text = "Impar";
          break;
        case Parity.Space:
          lblParity.Text = "Paridad 0";
          break;
    }


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 15 de agosto de 2009 17:56
  • hola,

    bueno por ahi podrias aplicar la misma tecnica del uso del switch.

    o sea en el combo cargas manualmente 5 item uno por cada opcion del enum que define los tipos de paridad.
    y luego sabiendo ya de antemano que cada item coincide uno a uno con las opciones del enum haces lo siguiente


    switch(cmbParidad.SelectedValue)
    {
        case 1:
          serialPort1.Parity = Parity.Even;
          break;
        case 2:
          serialPort1.Parity = Parity.Mark;
          break;
        case 3:
          serialPort1.Parity = Parity.None;
          break;
        case 4:
          serialPort1.Parity = Parity.Odd;
          break;
        case 5:
          serialPort1.Parity = Parity.Space;
          break;
    }


    como veras el value de cada voton representa una tipo de del enum de paridad, y en el switch segun la seleccion se lo asocias a tu instancia de serial port.

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 15 de agosto de 2009 23:17

Todas las respuestas

  • Ya lo descubrí:

    label_bits_por_segundo_02.Text = serialPort1.BaudRate.ToString();
    Hasta otra.

    EDITO :
    Ahora que me doy cuenta, no se coger el Bit de paridad. ¿Cómo lo hago?

    Saluo.
    sábado, 15 de agosto de 2009 17:19
  • hola,

    estas utilizando las clases de System.IO.Ports ?
    o sea la clase SerialPort

    si es asi tienes la orpiedad que te da esa info SerialPort.Parity

    por supuesto este devuelve una enumeracion Parity (Enumeración)

    lblParity.Text = serialPort1.Parity.ToString();
    si lo haces de esta forma obtendras la descripcion del enum, o sea el valor en ingles.
    si lo igualas a int, obtendras el valor numero del enumerado

    pero podrias hacer un switch

    switch(serialPort1.Parity)
    {
        case Parity.Even:
          lblParity.Text = "Par";
          break;
        case Parity.Mark:
          lblParity.Text = "Paridad 1";
          break;
        case Parity.None:
          lblParity.Text = "Ninguna";
          break;
        case Parity.Odd:
          lblParity.Text = "Impar";
          break;
        case Parity.Space:
          lblParity.Text = "Paridad 0";
          break;
    }


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 15 de agosto de 2009 17:56

  • Gracias por lo dea arriba.
    En handShake creo que es Control de flujo . Debe estar en Hardware pero en el C# dice otras cosas. ¿En cuál debo ponerlo si necesito el hardware?

  • hola,

    Handshake (Enumeración)

    creo que debes utilizar la opcion: RequestToSend

    o al menos esta parece ser la especificacion de control por hardware


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 15 de agosto de 2009 18:21
  • Puede ser, pero si lo pongo así cambiando las propiedades del serialPort1, el programa se me cuelga, que cosa más rara. Lo dejé en None y funciona bien, pero debo dejarlo en Hardware para comunicarlo con el PIC.

    En otropunto.
    Con el componente comboBox1 , quiero elegir las opciones por ejemplo de Paridad. me imagino que será algo el serialPort1 + combobox1 o algo así.

    No tengo idea.

    ¿Cómo puede ser?

  • hola,

    bueno por ahi podrias aplicar la misma tecnica del uso del switch.

    o sea en el combo cargas manualmente 5 item uno por cada opcion del enum que define los tipos de paridad.
    y luego sabiendo ya de antemano que cada item coincide uno a uno con las opciones del enum haces lo siguiente


    switch(cmbParidad.SelectedValue)
    {
        case 1:
          serialPort1.Parity = Parity.Even;
          break;
        case 2:
          serialPort1.Parity = Parity.Mark;
          break;
        case 3:
          serialPort1.Parity = Parity.None;
          break;
        case 4:
          serialPort1.Parity = Parity.Odd;
          break;
        case 5:
          serialPort1.Parity = Parity.Space;
          break;
    }


    como veras el value de cada voton representa una tipo de del enum de paridad, y en el switch segun la seleccion se lo asocias a tu instancia de serial port.

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 15 de agosto de 2009 23:17
  • Por cierto, gracias , ¿dónde hay queponer ese trozo de código?

    Pensaba que estaba dentro del:

    private void comboBox_paridad_SelectedIndexChanged(object sender, EventArgs e)
            {
              
            }


    domingo, 16 de agosto de 2009 9:34
  • hola,

    si pueder ir en varios lugares dependiendo de como declares tu objeto SerialPort.

    si lo declaras global a nivel de formulario puedes poenr el evento SelectedIndexChanged ya que tendras acceso al objeto para setear la propiedad

    pero sino esta a ese nivel el Serialport, puedes utilizarlo en el clicck del boton que realiza la comunicacion

    private void btnAbrir_RS232_Click(object sender, EventArgs e)
    {
        // creas el objeto SerialPort


    switch(cmbParidad.SelectedValue)
    {
        case 1:
          serialPort1.Parity = Parity.Even;
          break;
        case 2:
          serialPort1.Parity = Parity.Mark;
          break;
        case 3:
          serialPort1.Parity = Parity.None;
          break;
        case 4:
          serialPort1.Parity = Parity.Odd;
          break;
        case 5:
          serialPort1.Parity = Parity.Space;
          break;
    }

      // establces la comunicacion

    }


    como veras aunque tegnas evento de los controles no es necesario simpre utilizarlo, puedes usar sus propiedades desde otros eventos de otros controles, en este caso el click de un boton, leyendo la propiedad seleccionada del combo


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 16 de agosto de 2009 14:31
  • Utilizo el combobox en el Form principal, no dentro de botones. Es decir, que en tiempo real de que cambie los valores del comboBox del serialPort1. Lo quiero así.
  • hola,

    en ese caso si tines definida la variable de instancia del objeto SerialPort a nivel de formulario no tendras problema para lograrlo.

    ya que estar disponible para todos lo eventos

    o sea si lo tines definido de esta forma


        public partial class Form1 : Form
        {
            SerialPort serialPort = null;

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                serialPort = new SerialPort();
                serialPort.Open();
            }

            private void cmbParidad_SelectedIndexChanged(object sender, EventArgs e)
            {

                switch (Convert.ToInt16(cmbParidad.SelectedValue))
                {
                    case 1:
                        serialPort.Parity = Parity.Even;
                        break;
                    case 2:
                        serialPort.Parity = Parity.Mark;
                        break;
                    case 3:
                        serialPort.Parity = Parity.None;
                        break;
                    case 4:
                        serialPort.Parity = Parity.Odd;
                        break;
                    case 5:
                        serialPort.Parity = Parity.Space;
                        break;
                }
     
            }

            private void button1_Click(object sender, EventArgs e)
            {
                //
                // aqui estableces la lectura o escritura, o todo el codigo que necesites
                //
                string line = serialPort.ReadLine();
               
            }


            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                serialPort.Close();
            }


        }

    como observaras la definicion del objeto serial port esta a nivel de formulario

    lo que tiene de bueno esta forma es que puede abrir la lectura del puerto apenas comienza el form, y cerrarla cuando el form se cierra.

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 17 de agosto de 2009 0:13
  • la otra forma que te comentaba seria asi:

        public partial class Form1 : Form
        {
           
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
              
            }


            private void button1_Click(object sender, EventArgs e)
            {

                SerialPort serialPort = new SerialPort();
               
                // aqui estable ces demas configuracion que necesites

                //tambien especificas la paridad
                switch (Convert.ToInt16(cmbParidad.SelectedValue))
                {
                    case 1:
                        serialPort.Parity = Parity.Even;
                        break;
                    case 2:
                        serialPort.Parity = Parity.Mark;
                        break;
                    case 3:
                        serialPort.Parity = Parity.None;
                        break;
                    case 4:
                        serialPort.Parity = Parity.Odd;
                        break;
                    case 5:
                        serialPort.Parity = Parity.Space;
                        break;
                }

                serialPort.Open(); // abres la conexion luego de especificar todos los parametros

                //
                // aqui estableces la lectura o escritura, o todo el codigo que necesites
                //
                string line = serialPort.ReadLine();

                serialPort.Close();
            }

        }


    lo interesante es que aui defines el objeto solo en el ambito en donde lo necesitas o sea en el evento del boton que realiza la operacion con el mismo y nada mas que alli, es en ese evento que creas la instancia y utilizas la info seleccionada del combo para setear la paridad o demas valores que necesites configurar

    en el mismo evento abres y cierras la conexion del serial port

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 17 de agosto de 2009 0:16
  • ¿Qué tal?

    ¿Se puede hacer que se active los valores en Form_Load desde que carga la aplicación en vez del button o con un timer?

    Chao.
  • hola,

    a que te refieres cuando dices "se active los valores" ?

    o sea te refires a crear el objeto SerialPort, y setearle las propeidades ?

    si es asi puedo decir que si puedes, para ellos utiliza el primer ejemplo, algo asi


    public partial class Form1 : Form
        {
            SerialPort serialPort = null;

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //metodo que se encargara de cargar los items en el combobox
                // este metofdo deberas confeccionarlo agregandole valor-descripcion que coincidan con el
                // enum de Paridad           
                LoadComboBoxParidad();
               
                //defines por defecto el item 3 para que el suaurio lo vea seleccionado,
                // y es el que usas unas linea mas abajo en este mismo metodo           
                comboBoxParidad.SelecteValue = 3;
     
                serialPort = new SerialPort();
               
                 // especificas la propiedades por defecto, la de paridad y el resto que necesites
                 serialPort.Parity = Parity.None;

                serialPort.Open();
            }

            private void cmbParidad_SelectedIndexChanged(object sender, EventArgs e)
            {

                switch (Convert.ToInt16(cmbParidad.SelectedValue))
                {
                    case 1:
                        serialPort.Parity = Parity.Even;
                        break;
                    case 2:
                        serialPort.Parity = Parity.Mark;
                        break;
                    case 3:
                        serialPort.Parity = Parity.None;
                        break;
                    case 4:
                        serialPort.Parity = Parity.Odd;
                        break;
                    case 5:
                        serialPort.Parity = Parity.Space;
                        break;
                }
     
            }

            private void button1_Click(object sender, EventArgs e)
            {
                //
                // aqui estableces la lectura o escritura, o todo el codigo que necesites
                //
                string line = serialPort.ReadLine();
               
            }


    o sea como veras en el form_load solo podras especificar valores por defecto ay que el combo aun no esta cargado, y el usuario no ha seleccionado ninguna opcion, lo haces trabajar por defecto en un valor y luego el usuario podra ir cambiandolo o interactuando

    bueno espero te sea de utilidad
    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 17 de agosto de 2009 13:54

  • Para que sepas de que va, te muestro una imagen.



    Lo quiero hacer con cada componente del puerto COM.