Visualizzare i valori di un visore su seriale COM

di Anonimizzato31553 il
5 risposte
Cao a tutti.
Apro questa discussione per togliermi un dubbio! Qualche anno fa, per la mia azienda, avevo realizzato un software un VB che serviva a leggere in tempo reale il visore di una grossa bilancia tramite porta seriale per poter poi emettere delle etichette... oggi lo sto sto riscrivendo in C# con svariati miglioramenti. Il dubbio che ho è se posso migliorare il vecchio metodo che utilizzavo per leggere il valore del peso dalla porta seriale. Ovviamente questa operazione non deve essere bloccante per il software che deve permettere all'operatore di eseguire anche altre funzioni.

Attualmente imposto la porta e tramite un timer invio il comando alla porta, ogni 100 ms, che serve a ricevere il dato del peso. Tradotto in c# attualmente uso questo codice per leggere la bilancia e la domanda è sostanzialmente se esistono sistemi migliori:

private void Form1_Load(object sender, EventArgs e)
{

serialPort1.PortName = "COM4";

serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.ReadTimeout = 500;
serialPort1.Handshake = Handshake.XOnXOff;
serialPort1.Encoding = Encoding.UTF8;

serialPort1.Open();

timer1.Interval = 100;
timer1.Start();

}

private void timer1_Tick(object sender, EventArgs e)
{
serialPort1.Write("$");
label1.Text = serialPort1.ReadExisting();
}

Grazie in anticipo per i suggerimenti!

5 Risposte

  • Invece di usare un timer potresti creare un evento quando sulla porta arrivano dei dati.
    Dai un'occhiata qui
  • Se devi inviare il comando per avere la risposta, allora usa un thread
  • Concordo con oregon , qui trovi quello che ti serve per usare i thread https://docs.microsoft.com/it-it/dotnet/api/system.threading.thread?view=net-6.0

    potresti verificare anche l'efficienza dell'uso di un Backgroundworker se non vuoi creare tu direttamente un thread ma lasciarlo fare al Backgroundworker https://docs.microsoft.com/it-it/dotnet/api/system.componentmodel.backgroundworker?view=net-6.0
    qui un esempio https://stackoverflow.com/questions/29819552/c-sharp-backgroundworker-getting-data-continuously-from-arduino-via-serial
  • Grazie a tutti per i suggerimenti! adesso provo a lavorarci sopra
  • Ok, grazie ai vostri consigli ho risolto in questo modo :

    SerialPort mySerialPort = new SerialPort("COM3");

    private void Form1_Load(object sender, EventArgs e)
    {

    Thread t2 = new Thread(new ThreadStart(LetturaPesa));

    mySerialPort.BaudRate = 9600;
    mySerialPort.Parity = Parity.None;
    mySerialPort.StopBits = StopBits.One;
    mySerialPort.DataBits = 8;
    mySerialPort.Handshake = Handshake.XOnXOff;
    mySerialPort.RtsEnable = true;

    t2.Start();
    CheckForIllegalCrossThreadCalls = false;

    }

    public void LetturaPesa()
    {
    mySerialPort.Open();

    while (true)
    {
    mySerialPort.Write("$"); //Invio il comando alla seriale
    label1.Text = mySerialPort.ReadExisting(); //Leggo il Peso dal visore
    //Thread.Sleep(100);
    }
    }

    Grazie ancora per le risposte!!
Devi accedere o registrarti per scrivere nel forum
5 risposte