Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 19 Noviembre 2023, 09:02 am



Título: Poner un timer de 10 segundos
Publicado por: Meta en 19 Noviembre 2023, 09:02 am
Hola:

He hecho un formulario Windows Form en el cual envía este comando por cada 10 segundos.

Desde que ejecute el programa envía el comando.
Código
  1. serialPort1.Write("B\r");

No se como usar adecuadamente que el timer me funcione por cada 10 segundos, es decir, que por cada 10 segundos que pase, me envíe el comando.

Lo que pasa que si lo envía cada cierto tiempo, en muy poco tiempo, el dispositivo de cuelga y no devuelve nada.

Código completo C#.
Código
  1. using System;
  2. using System.IO.Ports;
  3. using System.Threading;
  4. using System.Windows.Forms;
  5.  
  6. namespace Balanza_Puerto_serie
  7. {
  8.    public partial class Form1 : Form
  9.    {
  10.        private delegate void DelegadoAcceso(String accion);
  11.        public Form1()
  12.        {
  13.            InitializeComponent();
  14.        }
  15.  
  16.        private void Form1_Load(object sender, EventArgs e)
  17.        {
  18.            try
  19.            {
  20.                serialPort1 = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
  21.                serialPort1.Handshake = Handshake.None;
  22.                serialPort1.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
  23.                serialPort1.ReadTimeout = 500;
  24.                serialPort1.WriteTimeout = 500;
  25.                serialPort1.Open();
  26.                serialPort1.Write("B\r");
  27.            }
  28.            catch(Exception ex)
  29.            {
  30.                MessageBox.Show(ex.Message);
  31.            }
  32.        }
  33.  
  34.        void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
  35.        {
  36.            if(this.Enabled == true)
  37.            {
  38.                Thread.Sleep(500);
  39.                string data = serialPort1.ReadExisting();
  40.                this.BeginInvoke(new DelegadoAcceso(si_DataReceived), new object[] {data});
  41.                serialPort1.Write("B\r"); // Envía comando.
  42.            }
  43.        }
  44.  
  45.        private void si_DataReceived(string accion)
  46.        {
  47.            label2.Text = accion;
  48.        }
  49.    }
  50. }


Título: Re: Poner un timer de 10 segundos
Publicado por: elektrostudios2 en 21 Febrero 2024, 10:07 am
¿Dónde está el Timer?. Si por Timer te refieres a esto: Thread.Sleep(500), eso no es lo que se denomina Timer en el contexto de .NET, sino simplemente una suspensión arbitraria de la ejecución del hilo durante un período de tiempo determinado.

Un Timer es una clase (System.Timers.Timer (https://learn.microsoft.com/es-es/dotnet/api/system.timers.timer) y System.Windows.Forms.Timer (https://learn.microsoft.com/es-es/dotnet/api/system.windows.forms.timer)) que te permite establecer un intervalo (en tu caso, sería de 10 segundos) mediante la propiedad Timer.Interval, y pasado ese intervalo se disparará el evento Timer.Elapsed que puedes controlar para enviar el "comando" al puerto serial.

El modo de empleo y los nombres de sus miembros difieren en función de la clase que escojas utilizar, pero ambas te permitirán lograr el mismo objetivo. Ya que estás usando Windows Forms, te convendría usar la clase System.Windows.Forms.Timer.

Aténtamente,
Elektro.