Usuario
Ayuda comunicacion serial en C#

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