/// <summary> /// Función para el envío de datos, antes de enviar comprueba que no se esté esperando una petición. /// Normalmente es un timer quien lanza esta función, pero también se podría lanzar manualmente. /// </summary> /// <param name="sender">Objeto que llama a la función (se puede pasar como valor null o this)</param> /// <param name="e">Arguemntos (no se tratan)</param> private void Envio(object sender, EventArgs e) { try { //Se detiene el timer para que no se llame al evento hasta que no se haya procesado tm_envio.Stop(); ///Gestiona un protocolo de parada y espera. Hasta que no se ha recivido una respuesta ///no procesa la siguiente. Ojo! no tiene en cuenta posibles fallos de comunicación. ///(no utiliza un timeout). ///Tras 300 intentos se pasa a la siguiente trama. reenvio++; if (reenvio < 300 && listaPeticiones.Count > 0 && listaPeticiones.ElementAt(count % listaPeticiones.Count).Value.WaitResponse == false) { count++; StatePeticion peticionActual = listaPeticiones.ElementAt(count % listaPeticiones.Count).Value; byte[] trama = peticionActual.Request; //Se envía el mensaje a traves el conector. conector.Enviar(trama); peticionActual.Set(); //Inicia la recepción de datos en el conector por si no estba listo para recibir. conector.StartReceive(); } //Tras 300 intentos se considera que la trama no se ha contestado o no ser ha recibido por parte del servidor else if (reenvio > 300) { listaPeticiones.ElementAt(count % listaPeticiones.Count).Value.Reset(); reenvio = 0; count++; } //Se reanuda el timer. tm_envio.Start(); } catch (Exception ex) { //MessageBox.Show("Error..... " + ex.Message); } finally { tm_envio.Start(); } }
/// <summary> /// Añade una petición a nuestra lista de peticiones. /// </summary> /// <param name="peticion"></param> public void Add(StatePeticion peticion) { //Se añade la petición a la lista StatePetción(trama, modelo de datos, función que procesará los datos recibidos, //servidor de protocolo al que pertenece la trama) listaPeticiones.Add(peticion.Request, peticion); }