Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme Timer

Timer ne se déclenche pas!

Sujet résolu
    21 avril 2011 à 14:02:20

    Bonjour!
    Alors je n'est pas l'habitue de demander de l'aide je préféré me débrouiller seul mais la il y a un bug dans la Matrice! :D
    Donc je doit réaliser un simulateur en C# qui envoie et reçois des info via un port série.
    Donc mon problème et le suivant des que j'envoie ma commande qui lance le timer via mon hyperterminal avec le debug on voie bien que le timer.enable ce met a true cependant il ne lance pas la fonction affilier à l'action du timer alors que ma commande stop de mon timer marche parfaitement ainsi que ma fonction affilier au timer (tester en mettant le timer a true des le début du programme mais après impossible de le relancer grâce à la commande).
    Le code:
    //buf et un string qui correspond a la commande récupérer via le port série
                switch (Buf)
                {
                    case "stop":
                    case "Stop":
                        timer1.Stop();
                        break;
                    case "startnow":
                    case "StartNow":
                        timer1.Start();
                        serialPort1.WriteLine("startlogging at = " + DateTime.Today + " " + DateTime.Now + ", sample interval = 60 seconds\r");
                        break;
                }
    

    ainsi que mon code la fonction affilier au timer:
    private void timer1_Tick_1(object sender, EventArgs e)
                {
                    StreamWriter Fw = new StreamWriter("acquisition.txt",true);
                    Random rndNumbers = new Random();
                    int rndNumber = 0;
                    rndNumber = rndNumbers.Next(15);
                    String s = tabDonnées[rndNumber];
                    textBox2.AppendText(s+ Entre + '\n' + '\r' + "\n" + "\r");
                    Fw.Write(s + Entre, true);
                    Fw.Flush();
                    Fw.Close();
                }
    

    J'ai essayer avec un bouton pour activer le timer en dehors du code qui test la commande et sa marche donc je suis perdue!
    J'espère que vous comprendrez et que vous pourrez m'aider!
    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      21 avril 2011 à 14:08:27

      Salut,

      Essaie de jouer avec la propriété Enable de ton timer au lieu des Start() et Stop()

      Ça devrait pas changer mais on sait jamais :-°
      • Partager sur Facebook
      • Partager sur Twitter
        21 avril 2011 à 14:10:53

        Salout!
        Déjà essayer c'est ce que j'ai fait des le début mais sa ne marcher pas non plus!! :(
        • Partager sur Facebook
        • Partager sur Twitter
          21 avril 2011 à 14:17:13

          Mwain..

          Déjà, je te conseille de faire un Buf = Buf.ToLower() avant ton switch, sa va t'éviter de devoir prendre en compte toutes les façons de l'écrire ;)

          Sinon, l'intervale de ton timer, il est à combien? Si il est abusivement long, c'est peut-être pour ça que tu penses qu'il ne fonctionne pas. Aussi, met un Breakpoint (point d'arrêt) dasn ta re-définition de l'évènement Tick et post le code de cette méthode aussi ^^ ça serait bien.
          • Partager sur Facebook
          • Partager sur Twitter
            21 avril 2011 à 14:32:24

            Serte le Buf.Tolower(); je n'y avait pas penser merci sa va me faire des ligne de code ne moins et comme dirait mon prof moins il y a de ligne moins il y a de problème!

            Sinon mon Timer s'exécute toute les secondes donc je pence pas que sa vienne de sa.
            Et pour le reste je n'est pas trop compris ce que tu veut dire pas la re-definition de l'événement Tick!! o_O
            • Partager sur Facebook
            • Partager sur Twitter
              21 avril 2011 à 15:01:09

              Laisse, tu l'a déjà mit, faut que je lave mes yeux xD

              EDIT :
              Vérifie que ton timer, dans les propriété, définit bien "timer1_Tick_1" Pour l'évènement Tick
              • Partager sur Facebook
              • Partager sur Twitter
                21 avril 2011 à 15:19:45

                L'événement de mon timer redirige bien vers ma fonction tick! En fait le problème c'est que le timer marche l'appelle marche car au debug je vois bien enable passer a true le problème c'est que quelle que chose bloque le timer attend si tu veux je te file le code entier bien qu'il soit long!! :o
                d'abord la fonction qui récupérer la commande:
                private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
                        {
                            ASCIIEncoding ascii = new ASCIIEncoding();
                
                            int iNbByteReceived = this.serialPort1.BytesToRead;
                
                            ReceivedBuffer=new Byte[64];
                            serialPort1.Read(ReceivedBuffer, 0, iNbByteReceived);
                            Data = ascii.GetString(ReceivedBuffer, 0, iNbByteReceived);
                            serialPort1.Write(Data);
                            if (Data == "\r")
                            { 
                                this.Invoke(new EventHandler(WriteData));
                                Test();
                                    Buf="";
                            }
                            else
                            {
                                if (Data == "\b")
                                {
                                    if(Buf != "")
                                    Buf=Buf.Substring(0, Buf.Length - 1);
                                }
                                else
                                {
                                    Buf = Buf + Data;
                                }
                                //throw new Exception
                            }
                        }
                
                        private void WriteData(object sender, EventArgs e)
                        {
                            textBox2.AppendText(Buf + '\n' + '\r' + Entre);
                        }
                

                Puis la fonction qui test la commande
                private void Test()
                        {
                            Buf = Buf.ToLower();
                            //classe que j'ai crée au debut pour pouvoir faire les teste de la commande finalement obliger de mettre dans le main certain commande car intéraction avec objet.
                            serialPort1.WriteLine(TestCommande.Test(Buf)+"\r");
                            
                            if (Buf.Contains("=") == true)
                            {
                                String[] Com = Buf.Split('=');
                                switch (Com[0])
                                {
                                    case "baudrate":
                                        serialPort1.BaudRate = Convert.ToInt16(Com[1]);
                                        break;
                                    default:
                                        break;
                                }
                            }
                            if (Buf.Contains(":") == true)
                            {
                                    
                                    String[] Com = Buf.Split(':');
                                    switch (Com[0])
                                    {
                                        case "getsamples":
                                            String[] Tab = Com[1].Split(',');
                                            FileStream Fs = new FileStream("acquisition.txt", FileMode.Open);
                                            StreamReader sr = new StreamReader(Fs);
                                            try
                                            {
                                                int A = Convert.ToInt32(Tab[0]);
                                                int B = Convert.ToInt32(Tab[1]);
                                                serialPort1.WriteLine("A=" + A + " B=" + B + "");
                                                for (int i = 1; i <= A; i++)
                                                {
                                                    sr.ReadLine();
                                                }
                                                for (int j = 1; j <= B - A; j++)
                                                {
                                                    serialPort1.WriteLine(sr.ReadLine()+"\r");
                                                }
                                            }
                                            catch
                                            {
                                                serialPort1.WriteLine(sr.ReadToEnd());
                                            }
                                            sr.Close();
                                            break;
                                        default:
                                            break;
                                    }
                                
                             }
                            switch (Buf)
                            {
                                case "stop":
                                    timer1.Stop();
                                    break;
                                case "startnow":
                                    timer1.Start();
                                    serialPort1.WriteLine("startlogging at = " + DateTime.Today + " " + DateTime.Now + ", sample interval = 60 seconds\r");
                                    break;
                            }
                        }
                

                Je ne sais pas si sa peux d'aider a m'aider mais la je commence a perdre patience sur ce truc sa fait depuis ce matin 9h que j'y suis et je craque. :p
                En tout cas même si on y arrive pas je te remercie pour ton aide! :D
                • Partager sur Facebook
                • Partager sur Twitter
                  21 avril 2011 à 15:32:19

                  depuis 9h se matin? ça fait juste 30 minutes ça :p (je blague, vive le décalage horaire ;) )

                  Hummm.... serait-il possible que ton programme soit en arret parce qu'il attend une entrée de donner? Ou qu'il soit toujours entrain de recevoir des donner?

                  Puis... ton FileStream, tu le close pas? (me souviens pas si ça se close)

                  J'y vais en essaie-erreur je l'Avoue!
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 avril 2011 à 15:44:52

                    Alors tu avait raison il me manquer bien un Fs.Close(); mais le problème n'est pas résolue.

                    Alors pour le fait que mon programme attende toujours des info(car oui comme c'est une communication série il attend toujours des info)j'y et penser donc c'est pour cela que j'ai utiliser un bouton qui fait sa:
                    private void button1_Click(object sender, EventArgs e)
                                {
                                    timer1.Start();
                    
                                }
                    

                    et la!!!! magique quand j'appuie sur le bouton sa marche! :colere2:
                    Bien que le programme série tourne toujours donc sa ne viens pas d'une autre fonction qui occupe toute les ressources.
                    En tous cas j'espère qu'au canada il fait beau car en France il fait un temps magnifique avec un ciel bleu et d'où je suis je peut même voir la mer sa donne pas envie de travailler. :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 avril 2011 à 15:54:28

                      Eh bien... je sèche :euh:

                      Pour l'attente des info, c'est normal, je parlais que le programme ne fait qu'exécuter la fonction serialPort1_DataReceived, mais comme tu l'as dit c'est pas le cas.

                      Je vois vraiment pas le problème, je laisse la main à quelqu'un d'autre.

                      Et puis non il fait pas beau au Québec, l'hivers fait son boulet, y'a neiger hier >_<
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 avril 2011 à 15:56:27

                        En tous cas merci pour tes lumières!! :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 mai 2011 à 15:53:33

                          EURÊKA!! Alors le problème venais que lorsque j'exécute mon timer.start() j'etais dans la fonction de récupération de donnée avec un thread qui empêche d'executer des fonction d'un autre objet. D'habitude cela nous affiche une erreur mais la rien donc dur à trouver. :(
                          Enfin la solution c'est d'utiliser un déléguer qui va executer une fonction qui va lancer notre timer. :D
                          La fonction:
                          private void Start_timer(object sender, EventArgs e)
                                  {
                                      timer1.Start();
                                  }
                          

                          L'appelle de la fonction via le deleguer:
                          case "startnow":
                                              this.Invoke(new EventHandler(Start_timer));
                                              break;
                          

                          J'espère que sa aidera du monde! :lol:
                          A+
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Probleme Timer

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown