Réception des données

Signaler
-
Messages postés
15647
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 mars 2021
-
Bonjour,

j'ai fait un petit programme qui sert a récupérée des données via un port série.
le programme doit fonctionner comme suit:
le transfert se faire par paquet de 100 caractère, le nombre total de boucle est de 1278,ce qui nous fait un transfert de 1278*100 octet environs.

private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            serialPort2.Write("\u000D");// lance la tach envoiFil

            progressBar1.Value = 0;


            if ( longueur_bytes_read <= 128977)
            {

                while (serialPort2.BytesToRead >0)
                {
                    char[] buffer = new char[101]; // on crée un char de 255 caractere            

                    longueur_bytes_read = serialPort2.Read(buffer, 0, buffer.Length);
                    //int longueur_bytes_read = serialPort2.Read(buffer, 0, buffer.Length); //lecture du buffer jusqu'a sa longeur buffer.Length               
                    //tes characteres sont contenus dans buffer.
                    //on remplit notre string value byte par byte par notre tableau de charactere buffer, le += fait que l'on écrase pas les données qui sont inserées, mais on les ajoutes.


                    for (int i = 0; i < longueur_bytes_read; i++)
                    {
                        value += buffer[i];

                        progressBar1.Value = ((longueur_bytes_read * 100 ) / 127800 * 100);
                        StatusLabel1.Text = progressBar1.Value.ToString() + "%" + "Télechargement en court...";
                    }
                }
           }

            else
            {
                StatusLabel1.Text = "terminé";
            }
        }


j'ai ajoute une progressBar, mais qui ne s'incrémente pas.
je suis débutante en c#.

pouvez- vous m'aider .

Edit: Précision du langage dans la coloration syntaxique.

3 réponses

Messages postés
15647
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 mars 2021
516
Bonjour, il faut mettre ta progressbar dans un thread séparé.
Tu peux utiliser un backgroundworker par exemple.

Je l'ai fait sur une des mes sources
http://codes-sources.commentcamarche.net/source/100423-le-jeu-du-boogle
bonjour,
 private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            serialPort2.Write("\u000D");// lance la tach envoiFil

           if ( longueur_bytes_read <= 128977)
            {

                while (serialPort2.BytesToRead >0)
                {
                   

                    char[] buffer = new char[250]; // on crée un char de 255 caractere            

                    longueur_bytes_read = serialPort2.Read(buffer, 0, buffer.Length);
                    //int longueur_bytes_read = serialPort2.Read(buffer, 0, buffer.Length); //lecture du buffer jusqu'a sa longeur buffer.Length               
                    //tes characteres sont contenus dans buffer.
                    //on remplit notre string value byte par byte par notre tableau de charactere buffer, le += fait que l'on écrase pas les données qui sont inserées, mais on les ajoutes.
                    

                    for (int i = 0; i < longueur_bytes_read; i++)
                    {
                        compteur ++;
                        value += buffer[i];

                        backgroundWorker1.RunWorkerAsync();
                     
                    }
                    
                }
         }

            else
            {
                StatusLabel1.Text = "terminé";
            }
        }

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            progressBar1.Value = ((compteur * 100) / 100);
            System.Threading.Thread.Sleep(100);
           // StatusLabel1.Text = progressBar1.Value.ToString() + "%" + "Télechargement en court...";
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            StatusLabel1.Text = e.ProgressPercentage.ToString() + "%" + "Télechargement en court...";
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            StatusLabel1.Text = ("Télechargement Fini");
        }


j'ai eu cette erreur

Opération inter-threads non valide : le contrôle 'progressBar1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
Messages postés
15647
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 mars 2021
516
J'ai encore corrigé ta coloration syntaxique, merci de lire la procédure que je t'ai indiquée dans ton premier message
Messages postés
15647
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 mars 2021
516
As tu regardé la source?
Certe elle fait beaucoup d'autres choses que d'afficher une progressbar, mais le principe c'est que dans le dowork, tu fais ton travail (dans ton cas recevoir les données) toutes les n boucles (1% max) tu envoies un événement tu généres l'évenement progresschanged avec la méthode ReportProgress.
C'est cet évenement qui peut intéragir avec la progressbar, soit directement (même formulaire) soit au travers d'un Dispatcher (comme dans le cas de ma source)

Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue