none
Problemas con Puerto Serie RRS feed

  • Pregunta

  • Hola !

    Estoy haciendo una aplicacion la cual debe conectarse con un aparato mediante el puerto serie.
    Cada vez que recibo un dato debo mandar un ack de confimacion al aparato.
    No tengo ningun problema para leer los datos que ese equipo me envia ni para confirmar la recepcion. 
    Esto lo hice usando el componente mscomm con el siguiente codigo:


    private void mscomm_OnComm(object sender, EventArgs e)
    {
    if (mscomm.InBufferCount > 0)
                {
                    superstring = superstring + mscomm.Input; //superstring es un string global
                    mscomm.Output = Convert.ToString(Convert.ToChar(6)); //envio ack
                    this.Invoke(new EventHandler(procesar)); //analizo datos
                }
    }


    El problema surge cuando quiero enviar los datos que recibi del aparato a otra computadora.
    Es decir, en la pc principal tengo 2 puertos serie, uno conectado al equipo y otro conectado a otra pc.
    La idea es que una vez analizada la cadena envie a otra pc los datos a guardar.

    El codigo que uso para intentar enviar es:

    mscomm.Output = "hola"


    He probado conectar los 2 puertos serie de la misma pc para comunicarlos entre ellos y no funciona.
    He probado por separado que los 2 puertos reciban bien los datos y lo hacen (conectando cada uno al aparato).
    Ambos envian bien el ack.
    El SThreshold y el RThreshold de cada componente mscomm tienen el valor 1 (para habilitar la recepcion y el envio, creo).
    Ambos tienen la misma configuracion de baudios, bit de paridad, y el resto de las configuraciones.


    Luego cree la siguiente funcion para comprobar si se enviaban datos desde uno de los puertos

    private void mscomm1_OnComm(object sender, EventArgs e)
    {
                switch (mscomm1.CommEvent)
                {
                    case 1:
                        MessageBox.Show("MANDO DATOS POR PUERTO");
                        break;
                    case 2:
                        MessageBox.Show("RECIBI ALGO");
                        break;
                }
    }

    Y funciona bien. Cuando envio cualquier texto aparece el messageBox correspondiente. Lo mismo para cuando recibo datos.
    Tambien he probado, en lugar de enviar directamente texto, enviando 

    mscomm1.Output = Encoding.ASCII.GetBytes("1");

    Y tampoco funciona.


    Luego de tanto probar decidi intentar lo mismo usando el componente serialport.
    Y tengo exactamente el mismo problema. Recibo bien pero no puedo enviar.


    Agradeceria mucho si alguien puede ayudarme

    Desde ya, gracias.
    sábado, 11 de septiembre de 2010 13:45

Respuestas

  • hola

    no has probado usando en tu aplicacion dos controles mscomm distintos ?, uno configurado para el COM1 y el otro para COM2

    o sea que cada control se conecte a un puerto seria distinto

    lo que lograrias es que recibes la info por el puerto COM1, o sea mscomm1, y la escribes en el COM2 que esta representado por mscomm2

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 11 de septiembre de 2010 13:49
  • hola

    solo para realizar una prueba, porque no reemplazas el mscomm, por las funcionalidad que provee .net para la conexion a puertos series

     

    SerialPort (Clase)

     

     

    Serial Communication using C#

    Serial Port Communication in C#

     

    SerialPort (RS-232 Serial COM Port) in C# .NET - #region Coad's Code

    no descartes todo tu codigo, realiza un proyecto nuevo bien simple que envie algo a un puerto y a otro, solo para probar si con esta funcionalidad se comporta adecuadamente

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 11 de septiembre de 2010 14:15
  • Realice una pequeña aplicacion para leer y escribir en un puerto serial  utilice el componente q tiene visual  q es serialport  y me funciona correctamente   te doy un ejemplo:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

    using System.IO.Ports;

    using System.Threading;

     

    namespace practicapuertos

    {

        public partial class Form1 : Form

        {

     

     

            string recibidos;

            public Form1()

            {

                InitializeComponent();

     

                ///abrir puerto cuando la aplicacion se ejecute

                #region

                if (!serialPort1.IsOpen)

                {

                    try

                    {

                        serialPort1.Open();

                    }

                    catch (System.Exception ex)

                    {

                        MessageBox.Show(ex.ToString());

                    }

                }

                #endregion

                //recibir datos del puerto

                #region

                serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(recibir);

     

            }

            private void recibir(  object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

     

            {

     

                recibidos += serialPort1.ReadExisting();

                this.Invoke(new EventHandler(actualizar));

            }

            private void actualizar(object s, EventArgs e)

            {

                textBox1.Text =recibidos; 

            }

                #endregion

     

     

            // mostrar hora del sistema

            #region

            private void timer1_Tick(object sender, EventArgs e)

            {

                //statusStrip1.Items[0].Text = DateTime.Now.ToLongTimeString();

                statusStrip1.Items[0].Text = DateTime.Now.ToShortDateString();

            }

             #endregion

     

            // escribir en el puerto;

            #region

            private void btnes_Click(object sender, EventArgs e)

            {

                Byte[] mBuffer = new byte[1];

     

                mBuffer[0] =0x45;

                serialPort1.Write(mBuffer, 0, mBuffer.Length);

     

     

     

     

     

            }

            #endregion

     

     

            // escojer entre dos puertos

            #region

            private void radioButton1_CheckedChanged(object sender, EventArgs e)

            {

                if (radioButton1.Checked == true)

                {

                    serialPort1.Close();

                    serialPort1.PortName = "COM2";

                    serialPort1.Open();

                    textBox1.Text = "COM2 seleccionado";

     

                }

                else

                {

                    serialPort1.Close();

                    serialPort1.PortName = "COM1";

                    serialPort1.Open();

                    textBox1.Text = "COM1 seleccionado";

                }

            }

            #endregion

     

     

     

     

     

     

     

     

     

     

        }

     

    }

       x4vi

    martes, 21 de septiembre de 2010 17:26

Todas las respuestas

  • hola

    no has probado usando en tu aplicacion dos controles mscomm distintos ?, uno configurado para el COM1 y el otro para COM2

    o sea que cada control se conecte a un puerto seria distinto

    lo que lograrias es que recibes la info por el puerto COM1, o sea mscomm1, y la escribes en el COM2 que esta representado por mscomm2

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 11 de septiembre de 2010 13:49
  • Si, es lo que hice. Tal vez no me explique bien.

    Tengo 2 mscomm diferentes, uno conectado al com1 y otro al com2.

    Tienen la misma configuracion excepto en el numero de puerto.

    sábado, 11 de septiembre de 2010 14:05
  • hola

    solo para realizar una prueba, porque no reemplazas el mscomm, por las funcionalidad que provee .net para la conexion a puertos series

     

    SerialPort (Clase)

     

     

    Serial Communication using C#

    Serial Port Communication in C#

     

    SerialPort (RS-232 Serial COM Port) in C# .NET - #region Coad's Code

    no descartes todo tu codigo, realiza un proyecto nuevo bien simple que envie algo a un puerto y a otro, solo para probar si con esta funcionalidad se comporta adecuadamente

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 11 de septiembre de 2010 14:15
  • Realice una pequeña aplicacion para leer y escribir en un puerto serial  utilice el componente q tiene visual  q es serialport  y me funciona correctamente   te doy un ejemplo:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

    using System.IO.Ports;

    using System.Threading;

     

    namespace practicapuertos

    {

        public partial class Form1 : Form

        {

     

     

            string recibidos;

            public Form1()

            {

                InitializeComponent();

     

                ///abrir puerto cuando la aplicacion se ejecute

                #region

                if (!serialPort1.IsOpen)

                {

                    try

                    {

                        serialPort1.Open();

                    }

                    catch (System.Exception ex)

                    {

                        MessageBox.Show(ex.ToString());

                    }

                }

                #endregion

                //recibir datos del puerto

                #region

                serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(recibir);

     

            }

            private void recibir(  object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

     

            {

     

                recibidos += serialPort1.ReadExisting();

                this.Invoke(new EventHandler(actualizar));

            }

            private void actualizar(object s, EventArgs e)

            {

                textBox1.Text =recibidos; 

            }

                #endregion

     

     

            // mostrar hora del sistema

            #region

            private void timer1_Tick(object sender, EventArgs e)

            {

                //statusStrip1.Items[0].Text = DateTime.Now.ToLongTimeString();

                statusStrip1.Items[0].Text = DateTime.Now.ToShortDateString();

            }

             #endregion

     

            // escribir en el puerto;

            #region

            private void btnes_Click(object sender, EventArgs e)

            {

                Byte[] mBuffer = new byte[1];

     

                mBuffer[0] =0x45;

                serialPort1.Write(mBuffer, 0, mBuffer.Length);

     

     

     

     

     

            }

            #endregion

     

     

            // escojer entre dos puertos

            #region

            private void radioButton1_CheckedChanged(object sender, EventArgs e)

            {

                if (radioButton1.Checked == true)

                {

                    serialPort1.Close();

                    serialPort1.PortName = "COM2";

                    serialPort1.Open();

                    textBox1.Text = "COM2 seleccionado";

     

                }

                else

                {

                    serialPort1.Close();

                    serialPort1.PortName = "COM1";

                    serialPort1.Open();

                    textBox1.Text = "COM1 seleccionado";

                }

            }

            #endregion

     

     

     

     

     

     

     

     

     

     

        }

     

    }

       x4vi

    martes, 21 de septiembre de 2010 17:26