Réception des données

Mahiouz - Modifié par Whismeril le 24/06/2015 à 10:58
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 24 juin 2015 à 15:38
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

Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
24 juin 2015 à 11:00
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
0
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éé.
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
24 juin 2015 à 15:34
J'ai encore corrigé ta coloration syntaxique, merci de lire la procédure que je t'ai indiquée dans ton premier message
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
Modifié par Whismeril le 24/06/2015 à 15:39
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
0
Rejoignez-nous