
Originariamente inviata da
MItaly
Che cosa stai usando per gestire i byte ricevuti dalla seriale? Controlli con un timer ogni tot? Ricevi degli eventi da un oggetto usato per gestire la porta seriale?
Uso una SerialPort.
Nella dll (per ora) c'è solo un'istanza a una serial port:
codice:
//Costruttore
public TARGHAprotocoll()
{
//Costruttore
PortaComunicazione = new SerialPort();
PortaComunicazione.DataReceived += new SerialDataReceivedEventHandler(EventoRicezionePortaSeriale);
}
public SerialPort PortaComunicazione;
Tutto il codice che decodifica il pacchetto è all'interno dell'evento SerialDataReceivedEventArgs.
Non vengono richiamati metodi al suo interno. Ci sono dei for, Case switch e degli if che controllano tutti i byte in arrivo. Il codice è lungo da postare ma provo a riassumerlo
codice:
private void EventoRicezionePortaSeriale(object sender, SerialDataReceivedEventArgs e)
{
int numeroDiDatiRicevuti = PortaComunicazione.BytesToRead;
byte[] bufferRxPresenti = new byte[numeroDiDatiRicevuti];
int numeroDatiDaLeggere = PortaComunicazione.Read(bufferRxPresenti, 0, numeroDiDatiRicevuti);
if (numeroDatiDaLeggere == 0)
return;
for (int tempIndex = 0; tempIndex < numeroDiDatiRicevuti; tempIndex++)
//Da qui partono tutta una serie di controlli che decodificano il messaggio
//Ad un certo punto, quando viene decodificato il messaggio, genero un nuovo evento.
//Proprio l'evento che poi mi da l'errore descritto in questo post
MessaggioTHARGAricevuto(this, new MessaggioTHARGAricevutoEventArgs());
//E come vedi, l'evento viene generato prima che si chiuda la graffa
//che termina il SerialDataReceivedEventArgs
}
Come altra informazione posso dire che l'idea del dll mi è venuta perchè questo protocollo lo dovrò usare costantemente in diversi progetti. Invece di scriverlo o copiarlo ogni volta ho pensato di fare una dll fissa che contenesse tutto il necessario.
Prima di questo facevo proprio il copia incolla di tutto il codice e facendo così funzionava.
Intendo, avere l'istanza della seriale e tutti i metodi nel medesimo file (che però era un form).
Effettivamente quando il codice doveva dichiarare un messaggio valido usavo un comando diverso:
this.Invoke(new EventHandler(ScritturaSuDisplayOrigine));