IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Comment gérer la réception de donnée avec SerialPort


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut Comment gérer la réception de donnée avec SerialPort
    Bonsoir,

    voila j'ai crée une application qui effectue un traitement sur les données au ASCII que je reçois par le port série avec la classe SerialPort, voici actuellement ma méthode que je vais vous détailler, mais je me demande si il n'existe pas plus simple ???

    Tous d'abord dans le dataReceived je récupére les donnnées reçu que je convertie en ASCII et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Delegate Sub _Affiche_ASCII(ByVal donnee As String)
     
    Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
            Dim nb_octet As Integer = RS232.BytesToRead ' on récupère le nombre d'octet présent dans le tampon
            Dim trame(nb_octet - 1) As Byte ' Tableau acceuillant les données au format byte
            RS232.Read(trame, 0, nb_octet) 'on lit le port
            Dim donnee As String = System.Text.Encoding.ASCII.GetString(trame) ' on récupère les données au format ASCII
            'L'évènement DataReceived se situe sur un thread différent que le form, nous devons donc appelé un délégué pour afficher le résultat à l'écran
            If Me.InvokeRequired Then
                Me.Invoke(New _Affiche_ASCII(AddressOf Affiche_ASCII), donnee)
            End If
     
        End Sub
    Ensuite ma procédure qui efface les sauts de ligne et autres caractère qui apparaissent dont je n'ai pas besoin et je remplace et ensuite j'envoi les données formaté vers une Textbox1, la textbox2 contenant tous les caractére brut reçu non formaté par cette procédure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Affiche_ASCII(ByVal donnee As String) 'permet de ranger correctement les données ASCII recu, en faisant les sauts de lignes
            TextBox2.Text = TextBox2.Text & donnee
            For Each ligne As String In TextBox2.Text
                Try
                    attente = TextBox2.Text.Replace(Chr(10), ControlChars.CrLf).Replace("W1", "").Replace("W1", "").Replace("W1E", "").Replace("W1E", "").Replace("W0F", "").Replace("E", "").Replace("F", "")
                    TextBox1.Text = attente
                Catch ex As Exception
                    les_try("fonction Affiche_ASCII" & ex.Message) 'ecrit dans le fihier texte exception l'erreur
                End Try
            Next
     
        End Sub
    Enfin je lance un timer lorsque l'on detecte un changement de text dans la textbox1 aprés 1s8 j'ai mis cette tempo afin d’être sur d'avoir tout recu (ce qui correspond à l'arrivée des données)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
            Timer_wait.Interval = 1800
            Timer_wait.Start()
        End Sub
    et enfin ce timer_wait va lancer la procédure declenchement_dispositif() pour effectuer le traitement final dont j'ai besoin !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Private Sub Timer_wait_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_wait.Tick
            declenchement_dispositif()
            Timer_wait.Stop()
        End Sub
    j'ai constaté que cela est très lourd pour le programme ! j'aurais voulu tout placer dans le datareceived mais le soucis c'est que le texte est assez long et le datareceived va tout de suite ce déclenché au premier caractére recu, alors que j'ai besoin de toutes les données reçu pour lancer ma procédure declenchement_dispositif(), j’espère mettre fait comprendre. d'avance merci

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    lu en diagonale, mais le mieux est sur datareceived d'ajouter ce qui est recu dans quelque chose (concat string ou add collection)
    et un timer qui vérifie que ce qui est arrivé est complet ou non (genre caractère de début de trame + fin de trame/longueur)
    si tu vois une trame correcte alors la retirer de ce quelque chose et la traiter
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/03/2006, 10h02
  2. Comment gérer des services par programmation avec Delphi ?
    Par isachat666 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 18/12/2005, 18h54
  3. Réponses: 2
    Dernier message: 08/07/2005, 10h40
  4. Réponses: 1
    Dernier message: 26/02/2005, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo