elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Recibir dos tramas por RS232 diferentes.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Recibir dos tramas por RS232 diferentes.  (Leído 9,645 veces)
profinet

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Recibir dos tramas por RS232 diferentes.
« Respuesta #10 en: 29 Noviembre 2023, 08:35 am »

He cometido varios descuidos al escribir ese código, al parecer.  :-\

Me complace que hayas logrado resolverlos y que el código ahora funcione correctamente, espero que te sea útil como ejemplo.

Además, es importante que incluyas los demás caracteres en el mismo arreglo de separadores para procesar todas las tramas. También te recomiendo separar la lógica de la interfaz de usuario de la lógica de gestión del puerto serie mediante la creación de clases distintas.


En línea

Don't shy away from the terminal; embrace it! In the GNU world, everything is a file.
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Recibir dos tramas por RS232 diferentes.
« Respuesta #11 en: 29 Noviembre 2023, 09:51 am »

Funciona gracias a ti.  ;-)

Eso sí, cambiaré en vez de recoger una cadena tipo string mejor tipo byte ya que en la tabla ASCII usa las 255 caracteres y muchos no son visuales sino de comportamientos.

https://learn.microsoft.com/es-es/dotnet/api/system.io.ports.serialport.read?view=dotnet-plat-ext-7.0

Haber si puedo cambiarlo sin que afecte su funcionamiento.


En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Recibir dos tramas por RS232 diferentes.
« Respuesta #12 en: 29 Noviembre 2023, 23:41 pm »

Hola:

Quiero enviar el comando B cada 3 segundos (3000 milisegundos) y el timer no funciona. Estoy trabajando en el :NET 8.0 y la verdad que falla más que una escopeta de feria, a parte que los textos de ayuda o errores del compilador se quitó el español y está en Inglés, un desastre.

En fin, dejo el código haber si sabes hacerlo o me quedo otra vez con el .Net 4.8.


Ver zoom.

Código C#:
Código
  1. using System.IO.Ports;
  2. using System.Text;
  3.  
  4. namespace Termite_SAI_05_.NET_8._0
  5. {
  6.    public partial class Form1 : Form
  7.    {
  8.        SerialPort puertoSerie;
  9.        bool verComandoBFlag = false;
  10.        bool verComandoX72Flag = false;
  11.        bool verComandoX5Flag = false;
  12.        public const string COMANDO_B = "B\r";
  13.        const string COMANDO_X72 = "X72\r";
  14.        const string COMANDO_X5 = "X5\r";
  15.  
  16.        public Form1()
  17.        {
  18.            InitializeComponent();
  19.            InitSerialPort();
  20.        }
  21.        private void Form1_Load(object sender, EventArgs e)
  22.        {
  23.            timer1.Start();
  24.        }
  25.        /* Iniciar y configurar el puerto serie */
  26.        private void InitSerialPort()
  27.        {
  28.            try
  29.            {
  30.                //Encoding cp437 = Encoding.GetEncoding(437);
  31.  
  32.                puertoSerie = new SerialPort()
  33.                {
  34.                    // Configuración del puerto serie.
  35.                    PortName = "COM3",           // Nombre del puerto serie.
  36.                    BaudRate = 2400,             // Velocidad en baudios.
  37.                    Parity = Parity.None,        // Esquema para comprobar la paridad de cada byte recibido.
  38.                    StopBits = StopBits.One,     // Número de bits de parada por byte.
  39.                    DataBits = 8,                // Número de bits de datos por byte.
  40.                    Handshake = Handshake.None,  // Protocolo de establecimiento.
  41.                    DtrEnable = true,            // Línea de terminal de datos.
  42.                    RtsEnable = true,            // Línea de solicitud.
  43.  
  44.                    // Establecer los tiempos de espera de lectura / escritura.
  45.                    ReadTimeout = 500,           // Tiempo de espera de escritura en ms.
  46.                    WriteTimeout = 500,          // Tiempo de espera de escritura en ms.
  47.  
  48.                    // Más configuraciones.
  49.                    DiscardNull = false,         // Descartar bytes nulos recibidos.
  50.                    ParityReplace = 63,
  51.                    ReadBufferSize = 4096,
  52.                    WriteBufferSize = 2018,
  53.                    ReceivedBytesThreshold = 1
  54.                };
  55.  
  56.                // Abrir puerto serie.
  57.                puertoSerie.Open();
  58.  
  59.                // Subscribir el evento DatosRecividos cuando lleguen datos.
  60.                puertoSerie.DataReceived += DatosRecividos;
  61.            }
  62.            catch (Exception ex)
  63.            {
  64.                MessageBox.Show(ex.Message);
  65.                puertoSerie.Close(); // Cierra el puerto en caso de error
  66.            }
  67.        }
  68.  
  69.        /* Evento para leer asíncronamente datos del puerto serie */
  70.        void DatosRecividos(object sender, SerialDataReceivedEventArgs e)
  71.        {
  72.            Task.Run(async () =>
  73.            {
  74.                try
  75.                {
  76.                    await Task.Delay(500); // Pausa para recibir datos
  77.                    string cadena = puertoSerie.ReadExisting();
  78.                    if (!string.IsNullOrEmpty(cadena))
  79.                    {
  80.                        if (verComandoBFlag == true) { ProcessCOMANDO_B(cadena); }
  81.                        if (verComandoX72Flag) { ProcessCOMANDO_X72(cadena); }
  82.                        if (verComandoX5Flag) { ProcessCOMANDO_X5(cadena); }
  83.                    }
  84.                    else
  85.                    {
  86.                        Console.Write("Datos leídos corruptos.");
  87.                    }
  88.                }
  89.                catch (IndexOutOfRangeException ex)
  90.                {
  91.                    Console.Write("Índice fuera de los límites de la matriz.");
  92.                    MessageBox.Show(ex.Message);
  93.                }
  94.                catch (FormatException ex)
  95.                {
  96.                    Console.Write("La cadena de entrada no tiene el formato correcto.");
  97.                    MessageBox.Show(ex.Message, "Error");
  98.                }
  99.            });
  100.        }
  101.  
  102.        /* Procesar COMANDO_X5 */
  103.        private void ProcessCOMANDO_X5(string cadena)
  104.        {
  105.            verComandoX5Flag = false;
  106.            char[] separadores = { '#', ',', '\r' };
  107.            string[] salida = cadena.Split(separadores, StringSplitOptions.RemoveEmptyEntries);
  108.  
  109.            // Al manipular controles de Windows Forms desde un hilo diferente al
  110.            // hilo de la interfaz de usuario, es necesario usar Invoke para evitar problemas de concurrencia.
  111.            if (InvokeRequired)
  112.            {
  113.                Invoke(new Action(() =>
  114.                {
  115.                    UpdateUIControlsComandoX5(salida);
  116.                }));
  117.            }
  118.            else
  119.            {
  120.                UpdateUIControlsComandoX5(salida);
  121.            }
  122.        }
  123.  
  124.        /* Procesar COMANDO_X72 */
  125.        private void ProcessCOMANDO_X72(string str)
  126.        {
  127.            verComandoX72Flag = false;
  128.            char[] separadores = { '#', ',', '\r' };
  129.            string[] salida = str.Split(separadores, StringSplitOptions.RemoveEmptyEntries);
  130.  
  131.            // Al manipular controles de Windows Forms desde un hilo diferente al
  132.            // hilo de la interfaz de usuario, es necesario usar Invoke para evitar problemas de concurrencia.
  133.            if (InvokeRequired)
  134.            {
  135.                Invoke(new Action(() =>
  136.                {
  137.                    UpdateUIControlsComandoX72(salida);
  138.                }));
  139.            }
  140.            else
  141.            {
  142.                UpdateUIControlsComandoX72(salida);
  143.            }
  144.        }
  145.  
  146.        /* Procesar COMANDO_B */
  147.        private void ProcessCOMANDO_B(string str)
  148.        {
  149.            verComandoBFlag = false;
  150.            char[] separadores = { '#', 'I', 'O', 'L', 'B', 'V', 'F', 'H', 'R', 'S', '\r' };
  151.            string[] salida = str.Split(separadores, StringSplitOptions.RemoveEmptyEntries);
  152.  
  153.            // Al manipular controles de Windows Forms desde un hilo diferente al
  154.            // hilo de la interfaz de usuario, es necesario usar Invoke para evitar problemas de concurrencia
  155.            if (InvokeRequired)
  156.            {
  157.                Invoke(new Action(() =>
  158.                {
  159.                    UpdateUIControlsComandoB(salida);
  160.                }));
  161.            }
  162.            else
  163.            {
  164.                UpdateUIControlsComandoB(salida);
  165.            }
  166.        }
  167.  
  168.        /* Mostrar datos COMANDO_X5 */
  169.        private void UpdateUIControlsComandoX5(string[] salida)
  170.        {
  171.            label_Resultado_Tension_nominal.Text
  172.                = salida[0] + " V";
  173.            label_Resultado_Cantidad_del_paquete.Text
  174.                = salida[1] + " Baterías";
  175.            label_Resultado_Capacidad_del_paquete.Text
  176.                = salida[2] + " Ah";
  177.            label_Resultado_Cantidad_externa.Text
  178.                = salida[3];
  179.            label_Resultado_Descarga_maxima.Text
  180.                = salida[4] + " Minuto";
  181.  
  182.            // Convertir variable tipo string a tipo uint, es decir, la variable tipo string "salida[5]"
  183.            // se convierte en tipo uint "resultadoSalida5".
  184.            uint resultadoSalida5 = UInt32.Parse(salida[5]);
  185.  
  186.            // Cálculos.
  187.            uint horas = resultadoSalida5 / 60;
  188.            uint minutos = resultadoSalida5 % 60;
  189.  
  190.            label_Resultado_Carga_maxima.Text
  191.                = $"{horas} Horas";
  192.  
  193.        }
  194.        /* Mostrar datos COMANDO_X72 */
  195.        private void UpdateUIControlsComandoX72(string[] salida)
  196.        {
  197.            label_Resultado_valores_nonimales_de_alimentacion.Text
  198.               = salida[0] + " VA / " + salida[1] + " W";
  199.            label_Resultado_voltaje_nominal.Text
  200.                = salida[2] + " Vac";
  201.            label_Resultado_corriente_nominal.Text
  202.                = salida[5] + " A";
  203.            label_Resultado_valores_nominales_de_frecuencia.Text
  204.                = salida[3] + " ~ " + salida[4] + " Hz";
  205.        }
  206.  
  207.        /* Mostrar datos COMANDO_B */
  208.        private void UpdateUIControlsComandoB(string[] salida)
  209.        {
  210.            label_I.Text
  211.                  = salida[0] + " Vac";
  212.            label_O.Text
  213.                = salida[1] + " Vac";
  214.            label_L.Text
  215.                = salida[2].TrimStart('0') + " %"; // Quita los ceros de la izquierda.
  216.            label_B.Text
  217.                = salida[3].TrimStart('0') + " %";
  218.            label_V.Text
  219.                = salida[4] + " Vdc";
  220.            label_F.Text
  221.                = salida[5].PadRight(5, '0') + " Hz"; // Añade ceros a la derecha.
  222.            label_H.Text
  223.                = salida[6].PadRight(5, '0') + " Hz";
  224.  
  225.            // Convertir variable tipo string a tipo uint, es decir, la variable tipo string "salida[7]"
  226.            // se convierte en tipo uint "resultadoSalida7".
  227.            uint resultadoSalida7 = UInt32.Parse(salida[7]);
  228.  
  229.            #region Horas y minutos.
  230.            // Cálculos.
  231.            uint horas = resultadoSalida7 / 60;
  232.            uint minutos = resultadoSalida7 % 60;
  233.  
  234.            // ¿0 horas y 1 minuto?
  235.            if ((horas == 0) && (minutos == 1))
  236.            {
  237.                label_R.Text = $"{minutos} minuto.";
  238.            }
  239.  
  240.            // ¿0 horas y 0 minuto?
  241.            if ((horas == 0) && (minutos == 0))
  242.            {
  243.                label_R.Text = $"{minutos} minutos";
  244.            }
  245.  
  246.            // ¿0 horas y más de 1 minuto?
  247.            if ((horas == 0) && (minutos > 1))
  248.            {
  249.                label_R.Text = $"{minutos} minutos.";
  250.            }
  251.  
  252.            // ¿1 hora y 0 minutos?
  253.            if ((horas == 1) && (minutos == 0))
  254.            {
  255.                label_R.Text = $"{horas} hora.";
  256.            }
  257.  
  258.            // ¿Más de una hora y 0 minutos?
  259.            if ((horas > 1) && (minutos == 0))
  260.            {
  261.                label_R.Text = $"{horas} horas.";
  262.            }
  263.  
  264.            // ¿1 hora y 1 minuto?
  265.            if ((horas == 1) && (minutos == 1))
  266.            {
  267.                label_R.Text = $"{horas} hora y {minutos} minuto";
  268.            }
  269.  
  270.            // ¿1 hora y más de 1 minuto?
  271.            if ((horas == 1) && (minutos > 1))
  272.            {
  273.                label_R.Text = $"{horas} hora y {minutos} minutos.";
  274.            }
  275.  
  276.            // ¿Más de 1 hora y 1 minuto?
  277.            if ((horas > 1) && (minutos == 1))
  278.            {
  279.                label_R.Text = $"{horas} horas y {minutos} minuto.";
  280.            }
  281.  
  282.            // ¿Más de 1 horas y más de 1 minuto?
  283.            if ((horas > 1) && (minutos > 1))
  284.            {
  285.                label_R.Text = $"{horas} horas y {minutos} minutos.";
  286.            }
  287.            #endregion
  288.  
  289.            uint barraProgresoB = UInt32.Parse(salida[3]);
  290.            progressBar_B.Value = (int)barraProgresoB;
  291.        }
  292.  
  293.        /* Evento de botón: Abrir puerto serie y mandar "B" */
  294.        private void button_Comando_B_Click(object sender, EventArgs e)
  295.        {
  296.            verComandoBFlag = true;
  297.            puertoSerie.Write(COMANDO_B);
  298.        }
  299.  
  300.        /* Evento de botón: Abrir puerto serie y mandar "X72" */
  301.        private void button_Comando_X72_Click(object sender, EventArgs e)
  302.        {
  303.            verComandoX72Flag = true;
  304.            puertoSerie.Write(COMANDO_X72);
  305.        }
  306.  
  307.        private void button_Comando_X5_Click(object sender, EventArgs e)
  308.        {
  309.            verComandoX5Flag = true;
  310.            puertoSerie.Write(COMANDO_X5);
  311.        }
  312.        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  313.        {
  314.            timer1.Stop();          // Detiene el temporizador.
  315.            Thread.Sleep(700);      // 0.5 segundos. 500 milisegundos.
  316.            puertoSerie.Close();    // Cierra el puerto serie.
  317.        }
  318.  
  319.        private void timer1_Tick_1(object sender, EventArgs e)
  320.        {
  321.            // Enviar comando B al puerto serie.
  322.            puertoSerie.Write(COMANDO_B);
  323.        }
  324.    }
  325. }

En resumen, quiero que se active el timer, por mucho que le de estas instrucciones que hace lo mismo, no funciona.

Código
  1. timer1.Enable = true;
  2.  
  3. timer1.Start();

Gracias.
Gracias.
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
rs232
Electrónica
juanjuan19 3 3,806 Último mensaje 10 Febrero 2012, 14:24 pm
por Meta
agregar diferentes arraylist a diferentes jlist
Java
manuhendrix 0 3,013 Último mensaje 20 Febrero 2013, 17:09 pm
por manuhendrix
[pregunta]como separo diferentes threats en diferentes ventanas en windows « 1 2 »
Programación C/C++
daryo 10 5,640 Último mensaje 4 Octubre 2013, 23:10 pm
por daryo
Recibir datos a través de AJAX diferentes divs
Desarrollo Web
itzg3 4 2,474 Último mensaje 10 Abril 2014, 22:36 pm
por itzg3
control rs232 via php
PHP
danny17 2 1,984 Último mensaje 21 Mayo 2014, 14:05 pm
por danny17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines