none
Ayuda comunicacion serial en C# RRS feed

  • Debate general

  • Buen día, racias de ante mano por ayudarme en este post, soy bastante nuevo en visual y uso actualmente visual studio 2015, mi proposito es comunicarme mediante puerto serial con un kit iridium a traves de comandos AT, en si solo deseo hacer un programa que envie un comando y de regreso obtener la respuesta pero mi problema es que solo funciona una vez y no se porque, es decir cuando yo preciono en este caso un boton que se llama inicializar envia un comando predefinido y recibo la respuesta correcta pero despues de enviar dos veces deja de funcionar y no se el porque, y me toca reiniciar todo el dispositivo iridium para que funcione. 

    Este es mi codigo 

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    using System.Windows.Forms;
    using System.IO.Ports;
    
    namespace Iridiumv1
    {
        public partial class Form1 : Form
        {
            private string strBufferIn;
            private string strBufferOut;
            private delegate void DelegadoAcceso(string accion);
            public Form1()
            {
                InitializeComponent();
            }
            private void AccesoForm(string accion)
            {
                strBufferIn = accion;
                //--datos del puerto serial 
                TxtDatosRecibidos.Text = strBufferIn;
            }
            private void AccesoInterrupcion(string accion)
            {
                DelegadoAcceso Var_DelegadoAcceso;
                Var_DelegadoAcceso = new DelegadoAcceso(AccesoForm);
                object[] arg = { accion };
                base.Invoke(Var_DelegadoAcceso,arg);
    
    
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                strBufferIn = "";
                strBufferOut = "";
                BtnConectar.Enabled = false;
                BtnInicializar.Enabled = false;
            }
    
            private void BtnBuscarPuertos_Click(object sender, EventArgs e)
            {
                string [] PuertosDisponibles = SerialPort.GetPortNames();
                CboPuertos.Items.Clear();
    
                foreach (string puerto_simple in PuertosDisponibles)
                {
                    CboPuertos.Items.Add(puerto_simple);
                }
                if (CboPuertos.Items.Count > 0)
                {
                    CboPuertos.SelectedIndex = 0;
                    MessageBox.Show("Seleccione un Puerto");
                    BtnConectar.Enabled = true;
                }
                else
                {
                    MessageBox.Show("Ningun Puerto Detectado");
                    CboPuertos.Items.Clear();
                    CboPuertos.Text = "                    ";
                    strBufferIn = "";
                    strBufferOut = "";
                    BtnConectar.Enabled = false;
                    BtnInicializar.Enabled = false;
                }
             }
    
            private void BtnConectar_Click(object sender, EventArgs e)
            {
                try
                {
                    if (BtnConectar.Text == "Conectar")
                    {
                        SpPuertos.BaudRate = Int32.Parse(CboBaudRate.Text);
                        SpPuertos.DataBits = 8; /*longitud de datos*/
                        SpPuertos.Parity = Parity.None;
                        SpPuertos.StopBits = StopBits.One;
                        SpPuertos.Handshake = Handshake.None;
                        SpPuertos.PortName = CboPuertos.Text;
                        try
                        {
                            SpPuertos.Open();
                            BtnConectar.Text = "Desconectar";
                            BtnInicializar.Enabled = true;
                        }
                        catch (Exception exc)
                        {
                            MessageBox.Show(exc.Message.ToString());
                        }
    
    
                    }
                    else if(BtnConectar.Text == "Desconectar")
                    {
                        SpPuertos.Close();
                        BtnConectar.Text = "Conectar";
                        BtnInicializar.Enabled = false;
                    }
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message.ToString());
                }
            }
    
            private void BtnInicializar_Click(object sender, EventArgs e)
            {
                try
                {
                    SpPuertos.DiscardOutBuffer();
                    SpPuertos.Write("AT+SBDMTA=1" + (char)13);
                    
    
    
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message.ToString());
                }
            }
    
            private void DatoRecibido(object sender, SerialDataReceivedEventArgs e)
            {
                AccesoInterrupcion(SpPuertos.ReadExisting());
              /*  string Data_in = SpPuertos.ReadExisting();
                MessageBox.Show(Data_in);
                TxtDatosRecibidos.Text = Data_in;*/
    
    
            }
    
            private void TxtDatosEnviar_TextChanged(object sender, EventArgs e)
            {
    
            }
        }
    }


    he notado tambien que siempre que deja de funcionar aparecen estos errores 

    'Iridiumv1.vshost.exe' (CLR v4.0.30319: Iridiumv1.vshost.exe): 'C:\Users\Usuario\Documents\Jona_Universidad\quinto\citec\Iridiumv1\Iridiumv1\bin\Debug\Iridiumv1.exe' cargado. Símbolos cargados.
    'Iridiumv1.vshost.exe' (CLR v4.0.30319: Iridiumv1.vshost.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll' cargado. No se encuentra el archivo PDB o no se puede abrir.
    'Iridiumv1.vshost.exe' (CLR v4.0.30319: Iridiumv1.vshost.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Accessibility\v4.0_4.0.0.0__b03f5f7f11d50a3a\Accessibility.dll' cargado. No se encuentra el archivo PDB o no se puede abrir.
    El subproceso 0x169c terminó con código 0 (0x0).
    El subproceso 0x5064 terminó con código 0 (0x0)

    Gracias por su ayuda.

    Tambien he notado que si en ese momento desconecto del puerto y uso hyperterminal para enviar un comando y vuelvo al programa para enviar algo funciona.


    • Editado jmcellere viernes, 5 de abril de 2019 0:21
    viernes, 5 de abril de 2019 0:19

Todas las respuestas

  • Hola:

    Para enviar comandos AT puede ser de varias formas. Mira primero la tabla ASCII.

    Si envias un solo caracter.

    private void button_t_Click(object sender, EventArgs e)
    {
        byte[] mBuffer = new byte[1];
        mBuffer[0] = 0x74; //ASCII letter "t".
        serialPort1.Write(mBuffer, 0, mBuffer.Length);
    }

    Si envias varios caracteres.

    private void button_t_Click(object sender, EventArgs e)
    {
        byte[] mBuffer = new byte[5];
        mBuffer[0] = 0x74;
        mBuffer[1] = 0x75;
        mBuffer[2] = 0x89;
        mBuffer[3] = 0x20;
        mBuffer[4] = 0x6C;
        serialPort1.Write(mBuffer, 0, mBuffer.Length);
    }


    Si envias varios caracteres pero en letras seguidas en modo texto que es el que te conviene.

    private void button_b_Click(object sender, EventArgs e)
    {
        byte[] mBuffer = Encoding.ASCII.GetBytes("Hello World");
        serialPort1.Write(mBuffer, 0, mBuffer.Length);
    }

    Aquí más información pero con Arduino, envío y recibir datos por puerto serie/USB.

    https://es.slideshare.net/Metaconta2/apagar-y-encender-led-con-arduino-y-visual-studio-2015

    Muchos enlaces por aquí.

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 21 de abril de 2019 8:07