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 6 et antérieur Discussion :

Communication Série un peu trop lente?


Sujet :

VB 6 et antérieur

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Communication Série un peu trop lente?
    -----------------
    Simon Brodeur
    -----------------

    Bonjours, j'ai des données à transferer d'une boîte noire à mon ordinateur. Je me suis fait un terminal et tout marche comme prévu, sauf que la communication est beaucoup trop lente à mon goût. La communication se fait à une baudrate de 9600 sur le port série.

    J'ai calculé un débit de 80 données/secondes avec mon terminal. Je suis même obliger de transmettre les données avec une pause de 5ms entre chacune. On dirait que mon microprocesseur à 8mhz est plus rapide que mon ordinateur!!!!!


    les données sont transmises comme ceci --->

    RD1111yy1111yy111yy111yy1111yy1111yyTC

    yy sépare les données de longueures variables (entre 3 et 4 caractères)
    et j'ai plusieurs autre commandes spéciale (ex: RD, TC...) pour annoncer la fin de la transmission ou le nombre de données envoyées..


    Si vous connaissez un moyen plus rapide de traiter mes données ou si mon code peu être amélioré, dites-moi le...

    Voici un APERÇU routine que j'utilise :

    PS. J'écrit directement les données dans un fichier texte


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    Do
     
    Do
      DoEvents
    If Not MSComm1.PortOpen Then
      GoTo Resetopt
      End If
      BufferIN = BufferIN & MSComm1.Input
    Loop Until InStr(BufferIN, "yy") Or InStr(BufferIN, "TC") Or InStr(BufferIN, "RD") Or InStr(BufferIN, "XY") Or InStr(BufferIN, "NV") Or InStr(BufferIN, "ND") Or InStr(BufferIN, "YD") Or InStr(BufferIN, "PT") Or InStr(BufferIN, "VY")
     
    Code = Right$(BufferIN, 2)
    Data = Left$(BufferIN, (Len(BufferIN) - 2))
     
    Select Case Code
     
    Case "TC"
        MStatus.Text = "Operation Sucessfull..." & vbCrLf & vbCrLf & "Status : Working"
     
    Case "RD"
        FLY.Close
        LED.FillColor = &HFF00&
        MStatus.Text = "Operation Sucessfull..." & vbCrLf & vbCrLf & "Status : Ready"
     
    Case "XY"
        MStatus.Text = "Choosing Y Axis..." & vbCrLf & vbCrLf & "Status : Working"
        MSComm1.Output = "/" & "H"
     
    Case "NV"
     
        If opt = 3 Then
        COMResume.Text = COMResume.Text & vbNewLine & vbNewLine & vbNewLine
        Else
        COMResume.Text = vbNullString
        End If
     
        COMResume.Text = COMResume.Text & vbNewLine & "     Communication Summary (Y) :" & vbNewLine
        COMResume.Text = COMResume.Text & "   ---------------------------------------------------" & vbNewLine
        COMResume.Text = COMResume.Text & "        NO VALUES IN MEMORY" & vbNewLine
        COMResume.Text = COMResume.Text & "   ---------------------------------------------------" & vbNewLine
     
        ProgressBar1.Value = ProgressBar1.Max
        ProgressBar2.Value = ProgressBar2.Max
        nbvalX.Caption = "NB VALUE : 0"
        nbvalY.Caption = "NB VALUE : 0"
     
    Case "ND"
        ProgressBar2.Min = 0
        nbvalH = Val(Data) / 2
        ProgressBar2.Max = nbvalH
     
    Case "YD"
        MStatus.Text = "Downloading..." & vbCrLf & vbCrLf & "Status : Working"
     
    Case "yy"
        Texty.Text = Data
        FLY.WriteLine (Data)
        nbvalL = nbvalL + 1
        nbvalY.Caption = "NB VALUE : " & Str$(nbvalL)
        If ProgressBar2.Value < nbvalH Then
        ProgressBar2.Value = ProgressBar2.Value + 1
        End If
     
    Case "PT"
        partRS = Val(Data)
        FLY.WriteLine ("----Part#" & Str(partRS) & "----")
        FLY.WriteBlankLines (3)
        partnb = partnb + 1
     
    Case "VY"
        nbvalS = Val(Data)
     
        If opt = 3 Then
        COMResume.Text = COMResume.Text & vbNewLine & vbNewLine & vbNewLine
        Else
        COMResume.Text = vbNullString
        End If
     
        COMResume.Text = COMResume.Text & vbNewLine & "     Communication Summary (Y) :" & vbNewLine
        COMResume.Text = COMResume.Text & "   ---------------------------------------------------" & vbNewLine
        COMResume.Text = COMResume.Text & "      Values Pretended = " & Val(nbvalH) & vbNewLine
        COMResume.Text = COMResume.Text & "      Values Sent = " & Val(nbvalS) & vbNewLine
        COMResume.Text = COMResume.Text & "      Values Received = " & Val(nbvalL) & vbNewLine
        COMResume.Text = COMResume.Text & "      Number of Parts = " & Val(partnb) & vbNewLine
        COMResume.Text = COMResume.Text & "   ---------------------------------------------------" & vbNewLine
     
    End Select
     
     
    BufferIN = vbNullString
     
    Loop Until Code = "RD"
    [/code]

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Juste une question : Dans "RD1111yy1111yy111yy111yy1111yy1111yyTC", quels types de données peuvent être celles représentées par des 1 ? Je précise : Peux-tu avoir des Y, des R des T, des C... etc

    A+

  3. #3
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Hé Hé !

    Il ne perd pas le nord, ouskel'n'or !!! J'apprécie beaucoup

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Merci, tu me fais rougir

  5. #5
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Encore convient-il, peut-être, d'expliquer à SimonBrodeur l'intérêt qu'il y aurait à choisir d'autres "séparateurs/identificateurs" ?

    Je te laisse faire.


  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ah, c'est ce que tu croyais ? Meû non, c'est pas ça ! Je ne pense pas qu'il puisse modifier les codes reçus. Par contre, si, par exemple, les 1 représentent des chiffres, on est sorti d'affaire. On évite un test interminable avec instr, pour le code on récupère les deux derniers caractères, quels qu'ils soient, on inclut le select case dans la 1ère boucle et on ajoute une ligne Case Else pour traiter les données n'incluant pas l'un des codes attendus (exit do ou autre chose... à voir selon la réponse de Simon le Brodeur... )
    Tu vois ?

    A+

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    En effet, les 1 représentent des chiffres. Je peux aussi modifier la façon de les envoyer... c'est pas un problème.

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Si nous laissons faire pour les fonctions spéciales comme RD et TC,
    quel est la meilleur façon de recevoir des données de longueurs variables en les différenciants ?

    Comment ou par quel caractère dois-je les séparer ? vbCR ou quelquechose comme cela ?

    Tout est programmable dans mon projet de boîte noire alors donner-moi toutes vos idées....


    Simon Brodeur

  9. #9
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Bon, on va tous réfléchir, pas à pas.

    Je commence à réfléchir à haute voix :

    Instr s'avère très lent sur des chaînes de grande longueur et il me semble donc qu'il faut l'éviter.

    si tes 111... représentent des groupes de 3 ou 4 chiffres, on en connait la longueur (3 ou 4)...

    les yy pourraient avantageusement être remplacés par un "#" ou un "@"..

    Une liste serait peut-être plus appropriée pour alimenter le tampon...

    Qui veut continuer à réfléchir avec nous ?...


  10. #10
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    On pourait essayer le Split après remplissage du buffer entre 2 caractères de contrôle.

    Je n'ai pas le temps de faire des tests de performance dans l'immédiat (je suis, moi-même sur un projet urgent et ne me permets que de petites poses forum).

    Si quelqu'un veut essayer...
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  11. #11
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Je crois que vous ne comprenez pas vraiment. Oui, ça m'est égal qu'on remplace le caractère de séparation, mais les données seront toujours de longueurs variables alors je n'est pas le choix de "couper" toutes les chiffres qui se trouve avant chaque caractère séparateur.

    Si vous avez bien compris le code (Ou si je l'ai bien fait) , le programme effectue la routine (reçoit dans le buffer) jusqu'à ce qu'il rencontre un caractère de séparation. Après, il coupe le caractère de séparation et garde seulement les données. Après chaque lecture comme cela, le buffer est remis à 0 (vbNullString) . Donc, InStr n'effectue ses recherche que sur un string de longeur égal à 4 ou 5 caractères, pas plus...

    Je doit vous dire aussi que ma boite noire ne dispose pas de controle de flux (pas assez de pins sur le microcontroller) , ce qui fait la boite noire envoit les données de façon continue, sans interruption. Ainsi, le programme doit être assez rapide pour recevoir et traiter les données sans en perdre.

    Simon Brodeur

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello,

    Je suis de l'avis d'AlainTech. Salut Alain
    En général, les caractères de contrôle utilisés par la sortie série sont XON et XOFF, soit contrôle H ou chr(8), et contrôle S ou chr(10). Il vaut mieux éviter ces deux là.
    Ceci dit, je propose autre chose en reprenant l'exemple que tu nous donnes.
    En fin de mot, tu mets un couple de caractères comportant toujours une même lettre, la première seule étant utilisée pour identifier les mots.
    Cela éviterait un loop until à rallonge.
    Exemple en mettant "F" en fin de mot ( il ne devra jamais être utilisé dans tes "Codes")
    Si on prend les tiens, ("yy", "TC", "RD", "XY", "NV", "ND", "YD", "PT" et "VY"), tu remplaces la seconde lettre par F, ce qui donne : yF, TF, RF, XF, NF, MF, YF, PF, et VF. J'ai remplacé ND par MF.
    Il ne te reste plus qu'à tester F : Si tu as F, tu as la fin d'un mot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Do
         Do
             DoEvents
             If Not MSComm1.PortOpen Then
                 GoTo Resetopt
             End If
             BufferIN = BufferIN & MSComm1.Input
         Loop Until InStr(BufferIN, "F")
         Code = Right$(BufferIN, 2)
         Data = Left$(BufferIN, (Len(BufferIN) - 2))
             Select Case Code
                 ....
    A la fin de ton select case, je mettrais un case else avec un message d'erreur qui te permettrait d'identifier une éventuelle donnée non répertoriée, au moins le temps de la mise au point de ta routine (sans erreur, un case else ne retarderait pas l'exécution ce qui veut dire que tu pourrais même le laisser)

    Tu dis

    A+

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    J'ai une chose à ajouter. Tu utilises un goto Resetopt... Or les goto ne sont pas dépilés. D'où le risque de saturer la pile selon que fait ton Resetopt.
    Si tu nous dit ce qu'il fait, on peut peut-être trouver une autre solution...

    A+

  14. #14
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    A simonlebrodeur :

    Le select case...
    .
    .
    .
    End select

    sort du select au 1er cas avéré rencontré...

    mettre en 1er case celui qui ne sera avéré que le dernier n'est pas une bonne idée.

    tu devrais mettre tes Cases dans l'ordre le plus susceptible possible d'être un Case avéré. Tu gagneras un peu de temps...

    Juste une petite idée..

  15. #15
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    La sub Resetopt sert seulement à éviter une erreur si je voudrait fermer le port série alors qu'il reçoit encore des données. En Somme, elle ne fait que "exit sub" mais tout d'abord je doit l'annoncer la déconnection avec plusieurs "label".

    Je crois que votre aide m'a été très utile et je crois avoir trouvé le bon chemin. Je vais maintenant me débrouiller seul. Merci à tous pour vos conseils...

    Simon Brodeur

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    En Somme, elle ne fait que "exit sub"
    On a toujours intérêt à remplacer un goto. Ici, tu peux faire appel à un sub-routine qui ferait le nécessaire, suivi d'un exit sub...
    Juste une petite remarque en passant...

    A+

  17. #17
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Résolu est vite dit... Résolu comment ?


    Bon, on va ce matin jouer comme on joue en cour de justice :

    1) Attendu que : l'examen des cases dans Select ne porte que sur Code

    2) Attendu que : aucune place n'y est faite pour un Case Else, ce qui laisse penser que Code est forcément l'un des cas traités au dessus

    3) Attendu que : la boucle Loop lance autant de Instr qu'il y a de Or et que celà est gourmand en temps

    4) Attendu que l'attendu 3 montre bien que le Code se termine forcément par une lettre

    5) Attendu que les données autres que Code ("1111") ne sont que numériques


    ARRETE : 1) Il convient TRES AVANTAGEUSEMENT de remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Loop Until InStr(BufferIN, "yy") Or InStr(BufferIN, "TC") Or InStr(BufferIN, "RD") Or InStr(BufferIN, "XY") Or InStr(BufferIN, "NV") Or InStr(BufferIN, "ND") Or InStr(BufferIN, "YD") Or InStr(BufferIN, "PT") Or InStr(BufferIN, "VY")
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Loop Until IsNumeric(Right(BufferIn,1)
    2) Si l'on utilisait 1 seule lettre (ou signe autre que numérique) pour les séparateurs, celà permettrait de faire d'une pierre 2 coups :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code = Right$(BufferIN, 1)
     Loop Until IsNumeric(code)
    et bien sur remplacer les cases (dans un meilleur ordre - voir message précédent) en fonction de ce séparateur unique plutot que constitué de 2 lettres..

    Mais c'est juste une idée..


    [/code]

  18. #18
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Correction MUY IMPORTANTE, bien sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Loop Until IsNumeric(Right(BufferIn,1) = False

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Véritable problème existentiel aboutissant à la terrible question de la vitesse de la lumière appliquée à un "instr" + un "<>" + "0" en comparaison de cette même vitesse appliquée sur un "isnuméric" + un "right" + "=" + un "false"
    Ça me fait penser que j'ai jamais testé un true sur un instr… Ça donne quoi ?

    A+

    PS - Tu sais comment les géomètres appellent ça ? "Pinailler le trilliardième de pine de mouche"

  20. #20
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Il suffit d'essayer çà :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Command1_Click()
    toto = "R"
    If IsNumeric(toto) = False Then titi = "oui" Else titi = "non"
    MsgBox titi
    End Sub
    Peut-être :

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2013, 22h35
  2. [java.nio] lecture un peu trop lente par rapport à un BufferedReader
    Par entreprise38 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 15/12/2008, 17h06
  3. [ATMEGA32] Communication UART trop lente
    Par jacklafrip dans le forum C
    Réponses: 3
    Dernier message: 09/12/2008, 23h09
  4. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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