Ritardo nella comunicazione o nel codice?

di il
7 risposte

Ritardo nella comunicazione o nel codice?

Salve a tutti oggi mi ritrovo a portare su questa piattaforma un problema che mi perseguita da mesi ormai. E che con le mie attuali conoscenze non riesco ad individuare. Vi faccio una brave introduzione per il contesto. Sto sviluppando un piccolo progetto personale. Un "semaforo" in realtà è un dispositivo hardware gestito da una scheda Elegoo(clone arduino) che svolge due funzioni. La prima è tramite appositi led colorati fare una sequenza di colori di un semaforo cioè rosso e verde e qui direi che non ci sono problemi. La seconda tramite delle fotoresistenze poste sul fondo della pista(è un progetto per il modellismo) rilevare il passaggio della macchinine e il tempo che la macchinina ha impiegato a fare il giro della pista. Il tempo che viene rilevato, immediatamente viene inviato su cavo USB ad un computer. Ora viene la seconda parte del mio piccolo progetto sul computer a dover leggere e stampare a schermo il tempo vi è un'interfaccia grafica compilata in C#. Fin qua tutto liscio, il problema dove sorge? Dopo che il programma ha Rilevato e stampato in apposite label 3 diversi numeri si freezza all'incirca per 6/7 secondi. Premessa ho già verificato singolarmente che a creare questa anomalia non siano i sensori o il codice d'arduino quindi suppongo che vi sia un problema nel programma in C# oppure quando li metto in comunicazione tra loro. Come ho accennato io solo recentemente mi sto approcciando all'incredibile mondo della programmazione e dell'elettronica. Quindi chiedo gentilmente se potreste darmi una mano ad individuare il problema e darmi qualche suggerimento per risolverlo (non voglio la pappa pronta se no non c'è divertimento!). Grazie a chi sarà così gentile da darmi una risposta e chiedo scusa se ho commesso imprecisioni o errori di formalità ma questo è il primo "post" che faccio.
Cordiali Saluti inserisco il codice di C#(in fase embrionale^2 ) sottostante.
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.Windows.Forms;
using System.IO.Ports;
using Timer = System.Timers.Timer;


namespace SEMAFORO
{
    public partial class Mini_4WD : Form
    {
        public bool active = false;
        public int TMilliSec = 0;
        public int TSec = 0;
        //public int Tick_count = 0;
        
        public Mini_4WD()
        {
            InitializeComponent();
            /*serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.Parity = Parity.None;
            serialPort1.StopBits = StopBits.One;*/
            //serialPort1.Open();
            CheckForIllegalCrossThreadCalls = false;

        }

        private void Button2_Click(object sender, EventArgs e)
        {
            serialPort1.Write("S");
            serialPort1.Close();
            label_Sensor1.Text = "- - - - -";
            label_Sensor2.Text = "- - - - -";
            label_Sensor3.Text = "- - - - -";

        }

        private void Start_Click(object sender, EventArgs e)
        {
            label_Sensor1.Text = "- - - - -";
            label_Sensor2.Text = "- - - - -";
            label_Sensor3.Text = "- - - - -";

            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.Parity = Parity.None;
            serialPort1.StopBits = StopBits.One;

            serialPort1.Open();

            serialPort1.Write("START");
            
               
            
        }

        private void SerialPort1_DataReceived(object sender,System.IO.Ports. SerialDataReceivedEventArgs e)
        {
            if ((serialPort1.ReadByte()) == 65) { label_Sensor1.Text = /*serialPort1.ReadLine();*/"a"; }
            if ((serialPort1.ReadByte()) == 66) { label_Sensor2.Text = serialPort1.ReadLine(); }
            if ((serialPort1.ReadByte()) == 67) { label_Sensor3.Text = serialPort1.ReadLine(); }
            //serialPort1.DiscardInBuffer();
        }
    }
}

7 Risposte

  • Re: Ritardo nella comunicazione o nel codice?

    Perdonami non ho letto tutto ... potresti riassumere il problema associato al codice in una domanda?
  • Re: Ritardo nella comunicazione o nel codice?

    Hai postato tutto il codice? magari mi sbaglio però ad esempio non vedo dove agganci l'handler dell'evento (SerialPort1_DataReceived) ,ciao
  • Re: Ritardo nella comunicazione o nel codice?

    Oltre a quello che hanno detto gli altri, fai l'errore classico di tutti quelli che iniziano: il refresh a video deve essere sganciato dall'arrivo dei pacchetti. Usa delle variabili, poi l'aggiornamento delle label le fai con un evento di un timer
  • Re: Ritardo nella comunicazione o nel codice?

    oregon ha scritto:


    Perdonami non ho letto tutto ... potresti riassumere il problema associato al codice in una domanda?
    chiedo scusa per il wall of text ti ringrazio per l'interessamento e sarò conciso: l'interfaccia grafica deve stampare all'interno delle label dei valori float che riceve tramite porta usb. Il problema è che dopo che ha stampato un valore per label si frezza per 6/7 secondi. Allora io essendo inesperto sopratutto nel c# chiedevo una dritta per risolvere questo problema.
  • Re: Ritardo nella comunicazione o nel codice?

    surfernet ha scritto:


    Hai postato tutto il codice? magari mi sbaglio però ad esempio non vedo dove agganci l'handler dell'evento (SerialPort1_DataReceived) ,ciao
    Ti ringrazio per l'interessamento. Si il codice c'è tutto forse in fondo ci sono degli spazi bianchi superflui(come ho detto il codice è super abbozzatissimo) che possono fuorviare sulla sua integralità. Chiedo umilmente scusa.
  • Re: Ritardo nella comunicazione o nel codice?

    Weierstrass ha scritto:


    Oltre a quello che hanno detto gli altri, fai l'errore classico di tutti quelli che iniziano: il refresh a video deve essere sganciato dall'arrivo dei pacchetti. Usa delle variabili, poi l'aggiornamento delle label le fai con un evento di un timer
    Quindi se ho capito bene un'errore che ho commesso è far refreshare il contenuto della label in maniera "diretta" quando in input arriva il valore? e mi consigli di in un primo momento assegnare tale valore ad un variabile e poi successivamente far stampare nella label il valore? se ho inteso bene ciò che mi hai detto ti chiedo se l'errore che ho commesso può far freezzare per 6/7 secondi il programma?
    grazie per l'interessamento e per la risposta!
  • Re: Ritardo nella comunicazione o nel codice?

    Gary" post_id="8633928 ha scritto:


    l'errore che ho commesso può far freezzare per 6/7 secondi il programma?
    Magari è dovuto al fatto che hai usato ReadLine senza farla partire da un thread, oppure non invii proprio il newline dalla board, o magari il messaggio finisce con un altro carattere.
    Io userei BytesToRead e Read, che sono più semplici, implementerei solo mezza seriale (PC solo in ascolto) e invierei un numero fisso di byte dalla board, a intervalli di un secondo, magari con un iniziatore e un terminatore univoci. Quando, dopo il debug, avrai un'idea più chiara di quello che succede, potrai decidere che strada prendere
Devi accedere o registrarti per scrivere nel forum
7 risposte