Ciao e grazie per aver considerato questa query: Invio un comando da un PC su una porta seriale virtuale a un sistema incorporato che echos indietro il comando quando il sistema incorporato ha completato il comando.C# attendere un eco sulla porta seriale, controllarlo e attendere un attimo sull'attesa
Posso inviare il comando e vedere l'eco, quando il comando è completato dal sistema incorporato, ma sto riscontrando problemi nel trovare un modo adeguato per attendere o ritardare il programma fino a quando non viene ricevuto il comando echo, in modo da può procedere e inviare il comando successivo. Suppongo che sia un tipo di controllo di flusso "di alto livello" che sto cercando di implementare. Il codice è in C#. Mi piacerebbe aspettare l'eco e avere un timeout anche nel caso in cui la comunicazione si interrompa tra il PC e il sistema embedded, in modo che il programma non si blocchi. Tutti i bambini Wizz là fuori che possono suggerire un modo pulito per fare questo? Non sono un grande programmatore C#, sto solo imparando.
Questa è la funzione di ricezione che ho:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// If the com port has been closed, do nothing
if (!comport.IsOpen) return;
// This method will be called when there is data waiting in the port's buffer
// Determain which mode (string or binary) the user is in
if (CurrentDataMode == DataMode.Text)
{
// Read all the data waiting in the buffer
string data = comport.ReadExisting();
// Display the text to the user in the terminal
Log(LogMsgType.Incoming, data);
}
else
{
// Obtain the number of bytes waiting in the port's buffer
int bytes = comport.BytesToRead;
// Create a byte array buffer to hold the incoming data
byte[] buffer = new byte[bytes];
// Read the data from the port and store it in our buffer
comport.Read(buffer, 0, bytes);
// Show the user the incoming data in hex format
Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
}
}
Questo è un esempio di una chiamata a un comando transmitt:
text = "AR" + 50 + "\r"; //transmit a command to move
this.comport.Write(text);
Attualmente sto usando un tempo di ritardo [Thread. Sleep (TIMEGAP)] e supponendo che il messaggio sia eseguito e che l'eco ritorni dal sistema embedded va bene MA non lo controllo e attendo anche molto tempo per assicurarmi che sia completato:
text = "AR" + 50 + "\r"; //transmit a command to move
this.comport.Write(text);
Thread.Sleep(TIMEGAP); //Timegap = 10000ms
Vorrei davvero sostituire la chiamata di ritardo [Thread.Sleep (TIMEGAP)] con una funzione/metodo che monitora la risposta sulla porta seriale, controlla che sia uguale a quella inviata e quindi consente al codice del programma di passare al comando successivo, E se l'eco corretto [AR50 \ r nell'esempio precedente] non viene ricevuto, ad esempio per 5 secondi, il programma segnala un errore.
Qualche suggerimento?
Grazie!
L'evento DataReceived non si attiverà per una linea completa, così si dovrebbe concatenare i dati ricevuti in un buffer globale. –
Dopo aver iniziato a considerare l'utilizzo di Thread.Sleep(), non ci sono buoni motivi per utilizzare l'evento DataReceived.Basta usare SerialPort.Read() per ottenere una risposta. Avere a che fare con i lunghi ritardi che questo può causare è di solito il prossimo problema. Rock e un posto difficile. –