Hola:
Los comandos que tiene subcomandos como el K60:1 no hay problemas. Hay respuesta que me lelgan de error,el que no tiene error es este.
Aquí un terminal que ejecuto B y X87.
ver imagen.
Cuando hay errore sraros, suele recibir estos mensajes.
#0
#-1
#-3
#-10
Con guines en medio.
Aquí abajo activa y desactiva el zumbador del SAI cuyo comando tiene subcomando.
Cualquier comando enviado se envía fácil, aquí el comando a enviar.
El problema está cuando hay que recibir respuesta de dicho comando y ya no estan fácil.
Hay que organizar todo, las respuestas. Como se dijo arriba, cada día una interpretación de cada comando que tarda uno por día porque es laaaaaarrrrrrrrrrgo y tedioso.
Aquí dejo un programa completo solo de un comando, el K60 que activa y desactiva el zumbador.
Otra cosa que no se si hay que usar el codificador Encoder que usé, por ejemplo este.
Y no se si realmente usar DTR como indica en el manual.
A ver si me responde que sistema de codificación usar realmente para que cuando me devuelva ASCII sea el que realmente es.
Estaba pensando en hacer un programa padre que cada comando tiene su propia interfaz hijo, así lo interpreta la respuesta recibida por cada interfaz. Suena chapuza pero pinta que funciona.
Interpretar el mismo interfaz diferentes respuestas ya es otro cantar.
Lo buenoq eu tiene al recibir respueta, es que empieza por # y termina en <cr> y ya se puede dibidir cadenas para analizarlas.
Sigo investigando y interpretando tus consejos.
Gaacias.
Los comandos que tiene subcomandos como el K60:1 no hay problemas. Hay respuesta que me lelgan de error,el que no tiene error es este.
Aquí un terminal que ejecuto B y X87.
ver imagen.
Cuando hay errore sraros, suele recibir estos mensajes.
#0
#-1
#-3
#-10
Con guines en medio.
Aquí abajo activa y desactiva el zumbador del SAI cuyo comando tiene subcomando.
Cualquier comando enviado se envía fácil, aquí el comando a enviar.
Código (csharp) [Seleccionar]
private void button_Desactivar_Click(object sender, EventArgs e)
{
byte[] mBuffer = Encoding.ASCII.GetBytes("K60:0\r"); // Comando K60:0 desactivar.
serialPort1.Write(mBuffer, 0, mBuffer.Length);
}
El problema está cuando hay que recibir respuesta de dicho comando y ya no estan fácil.
Hay que organizar todo, las respuestas. Como se dijo arriba, cada día una interpretación de cada comando que tarda uno por día porque es laaaaaarrrrrrrrrrgo y tedioso.
Aquí dejo un programa completo solo de un comando, el K60 que activa y desactiva el zumbador.
Código (csharp) [Seleccionar]
using System;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace Terminal_UPS_SAI_02
{
public partial class Form1 : Form
{
// Utilizaremos un string como buffer de recepción.
string recibidos;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
// Codificación.
//serialPort1.Encoding = Encoding.GetEncoding(437);
//serialPort1.Encoding = Encoding.GetEncoding(28591); // 28591 es lo mismo que ISO-8859-1.
serialPort1.Encoding = Encoding.GetEncoding("ISO-8859-1");
// Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
comboBox_Puerto.DataSource = SerialPort.GetPortNames();
// Añade puertos disponibles físicos y virtuales.
serialPort1.PortName = comboBox_Puerto.Text.ToString();
// Añadir datos recibidos en el evento.
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
catch (Exception error)
{
MessageBox.Show(error.Message, "Aviso:",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
// Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable.
protected override void WndProc(ref Message USB)
{
if (USB.Msg == 0x219)
{
comboBox_Puerto.DataSource = SerialPort.GetPortNames();
}
// Detecta si hay cambios en el usb y si los hay los refleja.
base.WndProc(ref USB);
}
private void button_Conectar_Click(object sender, EventArgs e)
{
try
{
serialPort1.PortName = comboBox_Puerto.Text.ToString(); // Puerto seleccionado previamente.
serialPort1.BaudRate = Convert.ToInt32(comboBox_Baudios.Text); // Baudios.
serialPort1.Open(); // Abrir puerto.
comboBox_Puerto.Enabled = false;
comboBox_Baudios.Enabled = false;
button_Conectar.Enabled = false;
button_Desconectar.Enabled = true;
groupBox_Control_Zumbador.Enabled = true;
}
catch (Exception error)
{
MessageBox.Show(error.Message, "Aviso:",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void button_Desconectar_Click(object sender, EventArgs e)
{
try
{
serialPort1.Close(); // Cerrar puerto.
comboBox_Puerto.Enabled = true;
comboBox_Baudios.Enabled = true;
button_Conectar.Enabled = true;
button_Desconectar.Enabled = false;
groupBox_Control_Zumbador.Enabled = false;
}
catch (Exception error)
{
MessageBox.Show(error.Message, "Aviso:",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
// Al cerrar el formulario, cierra el puerto si está abierto.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
serialPort1.Close(); // Cerrar puerto.
}
catch (Exception error)
{
MessageBox.Show(error.Message, "Aviso:",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
// Al recibir datos.
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Retardo de 500 ml.
//Thread.Sleep(500);
// Acumula los caracteres recibidos a nuestro 'buffer' (string).
recibidos += serialPort1.ReadExisting();
// Invocar o llamar al proceso de tramas.
this.Invoke(new EventHandler(Actualizar));
}
// Procesar los datos recibidos en el bufer y extraer tramas completas.
private void Actualizar(object sender, EventArgs e)
{
// Asignar el valor de la trama al richTextBox.
richTextBox1.Text += recibidos;
// Pasar a hexadecimal.
foreach (byte b in recibidos)
{
// x = minúscula, X = mayúscula.
richTextBox1.Text += b.ToString("X2");
}
// Nueva línea.
richTextBox1.Text += Environment.NewLine;
// Pasar a binario.
foreach (string leer in recibidos.Select(c => Convert.ToString(c, 2)))
{
richTextBox1.Text += leer.ToString();
}
// Nueva línea.
richTextBox1.Text += Environment.NewLine;
richTextBox1.Text += Environment.NewLine;
// Selecciona la posición final para leer los mensajes entrantes.
richTextBox1.SelectionStart = richTextBox1.Text.Length;
// Mantiene el scroll en la entrada de cada mensaje.
richTextBox1.ScrollToCaret();
// Limpiar.
recibidos = "";
}
private void button_Activar_Click(object sender, EventArgs e)
{
byte[] mBuffer = Encoding.ASCII.GetBytes("K60:1\r"); // Comando K60:1 activar.
serialPort1.Write(mBuffer, 0, mBuffer.Length);
}
private void button_Desactivar_Click(object sender, EventArgs e)
{
byte[] mBuffer = Encoding.ASCII.GetBytes("K60:0\r"); // Comando K60:0 desactivar.
serialPort1.Write(mBuffer, 0, mBuffer.Length);
}
private void button_Mute_temporal_Click(object sender, EventArgs e)
{
byte[] mBuffer = Encoding.ASCII.GetBytes("K60:2\r"); // Comando K60:2 Mute temporal.
serialPort1.Write(mBuffer, 0, mBuffer.Length);
}
private void button_Limpiar_Click(object sender, EventArgs e)
{
// Limpiar.
richTextBox1.Clear();
}
#region DTR y RTS.
private void checkBox_DTR_CheckedChanged(object sender, EventArgs e)
{
// ¿Marcado en true?
if (checkBox_DTR.Checked == true)
{
// Sí.
serialPort1.DtrEnable = true;
checkBox_DTR.Checked = true;
}
// No. Entonces...
else
{
serialPort1.DtrEnable = false;
checkBox_DTR.Checked = false;
}
}
private void checkBox_RTS_CheckedChanged(object sender, EventArgs e)
{
// ¿Marcado en true?
if (checkBox_RTS.Checked == true)
{
// Sí.
serialPort1.RtsEnable = true;
checkBox_RTS.Checked = true;
}
// No. Entonces...
else
{
serialPort1.RtsEnable = false;
checkBox_RTS.Checked = false;
}
}
#endregion
}
}
Otra cosa que no se si hay que usar el codificador Encoder que usé, por ejemplo este.
Código (csharp) [Seleccionar]
Encoding.GetEncoding("ISO-8859-1");
Y no se si realmente usar DTR como indica en el manual.
A ver si me responde que sistema de codificación usar realmente para que cuando me devuelva ASCII sea el que realmente es.
Estaba pensando en hacer un programa padre que cada comando tiene su propia interfaz hijo, así lo interpreta la respuesta recibida por cada interfaz. Suena chapuza pero pinta que funciona.
Interpretar el mismo interfaz diferentes respuestas ya es otro cantar.
Lo buenoq eu tiene al recibir respueta, es que empieza por # y termina en <cr> y ya se puede dibidir cadenas para analizarlas.
Sigo investigando y interpretando tus consejos.
Gaacias.