[C#] evento processato 3 volte

mercoledì 13 febbraio 2008 - 16.00

Francesca1983 Profilo | Newbie

Ciao a tutti,
ho un problema di questo tipo:
sto facendo un'applicazione che gestisce l'invio e la ricezione di dati su rs232, ogni ricezione andata a buon fine o no scatena rispettivamente un evente di RxOK o RxErr...il problema è che in fase di debug ho inserito un contatore che traccia gli eventi che vengono chiamati e i contatori si incrementano con un fattore 3...
Ogni volta che si scatena l'evento mi rimane nel metodo (RxOK o RxErr) per 3 volte senza tornare mai al codice che chiama il delegato.....posto il codie...magari si capisce di più...:

CLASSE SERIALE: // Delegate declaration public delegate void typeReceiveEndOk(object sender, System.EventArgs endOk); public delegate void typeReceiveEndError(object sender, System.EventArgs endErr); // Event Declaration. public event typeReceiveEndOk receiveEndOk; public event typeReceiveEndError receiveEndError; System.EventArgs endErr = new System.EventArgs(); System.EventArgs endOk = new System.EventArgs(); // Verifica dei dati ricevuti. switch (checkDataReceived()) { case stateCheckDataReceived.OK: enableComRx = false; timeTx.Enabled = false; // Funzione terminata, devo generare un evento che e' tutto OK. // System.EventArgs endOk = new System.EventArgs(); receiveEndOk(this, endOk); break; case stateCheckDataReceived.ERR: enableComRx = false; timeTx.Enabled = false; // Genero un evento di fine comunicazione con errore. receiveEndError(this, endErr); //**************************************************** // setto gli eventi di errore e di OK //**************************************************** Serial485.receiveEndError += new Serial485_Pse.typeReceiveEndError(RxErr); Serial485.receiveEndOk += new Serial485_Pse.typeReceiveEndOk(RxOk); ---------------------------------------------------------------------------------- CLASSE UTILIZZATRICE: /******************************************************** * Evento Ricezione andata a buon fine ******************************************************** */ private void RxOk(object sender, EventArgs e) { Int16 tara = 0; Int16 ricOK = 0; Int16 statoProd = 0; string stringaVersione = ""; //Debug. debCntPckt++; // classe che trasforma i buffer ricevuti in stringhe in // modo che sia piu' semplice testare i comandi. strg_cmd = class_BuildData.cmdFromByte(Serial485.cmdRx); strg_subCmd = class_BuildData.cmdFromByte(Serial485.subCmdRx); nrFormulaTB.Text = Convert.ToString(debCntPckt); switch (strg_cmd) { case "WTD": tara = class_BuildData.intFromBfByte(Serial485.bfDataRx, 3); ricOK = class_BuildData.intFromBfByte(Serial485.bfDataRx, 2); statoProd = class_BuildData.intFromBfByte(Serial485.bfDataRx, 1); if ((ricOK == 1) && (statoProd == 99)) dosaggiTB.Text = "Fine dosaggio!!!!"; break; case "FOR": switch (strg_subCmd) { case "SAB": stateSubCmdFormula = subCmdFormula.LEG; break; case "LEG": stateSubCmdFormula = subCmdFormula.TM1; break; case "TM1": stateSubCmdFormula = subCmdFormula.H2O; break; case "TM2": stateSubCmdFormula = subCmdFormula.TAR; break; case "H2O": stateSubCmdFormula = subCmdFormula.TM2; break; case "TAR": frameToTx = listFrameToTx.STR; break; } break; case "STR": frameToTx = listFrameToTx.WTD; break; case "ERR": break; case "VER": stringaVersione = class_BuildData.stringFromBfByte(Serial485.bfDataRx, 1); frameToTx = listFrameToTx.WTD; break; case "END": if (Convert.ToInt16(dosaggiTB.Text) > contaDosaggi) { frameToTx = listFrameToTx.FOR; contaDosaggi++; } else if (Convert.ToInt16(dosaggiTB.Text) == contaDosaggi) { // @@@@@@@@@@@@@@@ panelFineCicli.Visible = true; eseguiB.Enabled = false; acquaMenoB.Enabled = false; acquaPiuB.Enabled = false; dosaggiMenoB.Enabled = false; dosaggiPiuB.Enabled = false; indietroB.Enabled = false; // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // visualizza pulsanti con selezione 1/2 1/4 e FINE.... // disabilita le text box // controllo tipo di selezione } break; } fSerialeFree = true; } /* * ************************************ * Evento Ricezione CON Errore * ************************************** */ private void RxErr(object sender, EventArgs e) { debTaraRx++; dosaggiTB.Text = Convert.ToString(debTaraRx); fSerialeFree = true; }
Volevo sapere se è un problema degli eventi in se o se ho sbagliato qualcosa...Grazie!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5