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

Discussion :

VB6 MSCOmm réception données binaires


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : avril 2014
    Messages : 14
    Points : 13
    Points
    13
    Par défaut VB6 MSCOmm réception données binaires
    Bonjour,

    Je cherche depuis 2 jours mais je cale complètement, aucun exemple trouvé sur le net ne correspond ou ne fonctionne

    Voilà, je suis en train de faire une appli permettant de paramétrer un appareil via port com et liaison infra rouge (un petit module USB - IRDA qui est vu comme un port COM) afin de remplacer une "pocket" (un Palm, avec appli constructeur intégré, et port infra rouge) .
    J'ai pu récupérer les codes envoyés par le Palm via 232Analyzer.
    En décimal, ils se présentent sont cette forme, par exemple :
    016 002 002 002 016 003

    Pour l'envoi, je fais comme ceci :
    Commande = Chr(16) & Chr(2) & Chr(2) & Chr(2) & Chr(16) & Chr(3)
    MSComm1.Output = Commande
    Cela fonctionne, l'appareil reçoit bien l'ordre et exécute la fonction correspondante.

    En revanche, pour récupérer ce que l'appareil renvoi comme code (sous la même forme, toujours visualisé avec 232Analyzer), par exemple, si je relis la config de l'appareil, j'ai ceci, si les valeurs de ses paramètres sont bons :
    016 002 067 032 003 002 196 009 196 009 020 000 118 016 003 (aussi, elle est répétée plusieurs fois lors de la lecture)

    L'idée étant de lire par exemple la config et de comparer avec une valeur définie et dire si elle est conforme ou non.
    De même pour les accusés de réceptions des différents ordres de test.
    Toutes les communications commencent par 016 002 et finissent par 016 003.

    Je pense dans un premier m'inspirer d'un code comme celui ci pour visualiser le code recu (on vera après pour le stocker sous forme de valeur d'une variable, ca risque d'etre marrant aussi ça) :
    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
    Private Sub MSComm1_OnComm()
     
     
    Select Case MSComm1.CommEvent
    ' On effectue la gestion des erreurs (cf. le modèle ci-dessus)
    ' Ici, on gère en fait pas grand-chose, mais c'est pour illustrer la démarche ;)
     
    'liste des erreurs possibles
    Case comEventBreak 'On a reçu un signal d’interruption (Break)
    Case comEventCDTO ' Timeout de la porteuse
    Case comEventCTSTO ' Timeout du signal CTS (Clear To Send)
    Case comEventDSRTO ' Timeout du signal de réception
    Case comEventFrame ' Erreur de trame
    Case comEventOverrun ' Des données ont été perdues
    Case comEventRxOver ' Tampon de réception saturé
    Case comEventRxParity ' Erreur de parité
    Case comEventTxFull ' Tampon d’envoi saturé
    Case comEventDCB ' Erreur de réception DCB (jamais vu)
     
    'liste des événements possibles qui sont, eux, normaux
    Case comEvCD 'Changement dans la broche CD (porteuse)
    Case comEvCTS 'Changement dans broche CTS
    Case comEvDSR 'Changement dans broche DSR (réception)
    Case comEvRing 'Changement dans broche RING (sonnerie)
     
    'Chouette! on a reçu des données :)
    Case comEvReceive
          tampon = MSComm1.Input
          tampon = Asc(tampon)
         Text1.SelText = (tampon) & "," 'ici, on affiche le résultat dans un champ de texte
     
    Case comEvSend ' il y a des caractères à envoyer
     
    Case comEvEOF 'on a reçu le caractère EOF
    End Select
     
    End Sub
    Evidement, ca m'affiche des valeurs farfelues.

    Je pense qu'il faudrait récupérer chaque octet, donc sur l'exemple de la lecture de config :
    00010000 00000010 01000011 00100000 00000011 00000010 11000100 00001001 11000100 00001001 00010100 00000000 01110110 00010000 00000011

    Je pense qu'il faut utiliser "InputMode = comInputModeBinary" (d’ailleurs, est-ce que cela change aussi le mode output ou je peux garder mes Chr(016) etc etc ?) , mais plus je fais d'essais plus j'ai entre rien et n'importe quoi

    Je patauge complètement (en temps normal, c'est bien pour un canard , mais là nan ).

    Un petit coup de palme serait bienvenu

    Merci et à bientôt
    Couin

  2. #2
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 926
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 926
    Points : 11 222
    Points
    11 222
    Par défaut
    Salut

    J'avais un programme qui nécessitait une conversion binaire vers décimale et inversement, du coup je te propose un une version simplifié.
    Dans un projet, un module.BAS et un Form avec 4 CommandButtons et 3 TextBoxs,
    Code du Module1.BAS
    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
    Option Explicit
     
    Dim Binnaire(16) As Long
    Dim T As Double, U As Integer
     
    Public Sub Main()
    For T = 1 To 16: Binnaire(T) = 2 ^ (T - 1): Next T
    Form1.Show
    End Sub
     
    Public Function Bin8_Dec(ValBin As String) As Integer
        'exemple: 11100011 = 227
        Dim StrDonn As String
        StrDonn = CStr(ValBin)
        U = Len(StrDonn)
        For T = 1 To U
            If Mid$(StrDonn, T, 1) = 1 Then Bin8_Dec = Bin8_Dec + Binnaire(U - (T - 1))
        Next T
    End Function
     
    Public Function Dec_Bin8(ValDec As Integer) As String
        'exemple: 227 = 11100011
        U = 8
        For T = 1 To 8
            If ValDec >= Binnaire(U - (T - 1)) And ValDec <> 0 Then
                Dec_Bin8 = Dec_Bin8 & "1": ValDec = ValDec - Binnaire(U - (T - 1))
                Else
                Dec_Bin8 = Dec_Bin8 & "0"
            End If
        Next T
    End Function
    Code du Form1.frm
    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
    92
    93
    94
    95
    96
    97
    Option Explicit
    Dim TT As Integer
    Dim TextRecupe As String
     
    Private Sub Form_Load()
        Me.Height = 3645: Me.Width = 5205: Me.Caption = "Convertisseur"
     
        Text1.FontName = "Courier New"
        Text1.FontSize = 8
        Text1.Move 120, 60, 4740, 795
        Text1.BorderStyle = 1
        Text1.Appearance = 0
        'Text1.MultiLine = True <------------ A faire en desing -------------
        Text1.Text = "00010000 00000010 01000011 00100000 00000011 00000010 11000100 00001001 11000100 00001001 00010100 00000000 01110110 00010000 00000011"
     
        Command1.Move 120, 900, 2355, 435: Command1.Caption = "^-- Binnaire ---> Décimale --v"
        Command2.Move 2555, 900, 2295, 435: Command2.Caption = "v-- Décimale ---> Binnaire --^"
     
        Text2.FontName = "Courier New"
        Text2.FontSize = 8
        Text2.Move 120, 1380, 4740, 555
        Text2.BorderStyle = 1
        Text2.Appearance = 0
        'Text2.MultiLine = True <------------ A faire en desing -------------
        Text2.Text = ""
     
        Command3.Move 120, 1980, 2355, 435: Command3.Caption = "^-- Ascii ---> caractère --v"
        Command4.Move 2555, 1980, 2295, 435: Command4.Caption = "v-- caractére ---> Ascii --^"
     
        Text3.FontName = "Courier New"
        Text3.FontSize = 8
        Text3.Move 120, 2460, 4740, 555
        Text3.BorderStyle = 1
        Text3.Appearance = 0
        'Text3.MultiLine = True <------------ A faire en desing -------------
        Text3.Text = ""
     
    End Sub
     
    Private Sub Command1_Click()
        If Trim(Text1.Text) = "" Then Exit Sub
        Dim ArrayDataBin() As String
        ArrayDataBin = Split(Trim(Text1.Text), " ")
        TextRecupe = "": Text2.Text = ""
        For TT = 0 To UBound(ArrayDataBin)
            TextRecupe = TextRecupe & CStr(Bin8_Dec(ArrayDataBin(TT))) & " "
        Next TT
        TextRecupe = Left(TextRecupe, Len(TextRecupe) - 1)
        Text2.Text = TextRecupe
    End Sub
     
    Private Sub Command2_Click()
        If Trim(Text2.Text) = "" Then Exit Sub
        Dim ArrayDataDec() As String
        ArrayDataDec = Split(Trim(Text2.Text), " ")
        TextRecupe = "": Text1.Text = ""
        For TT = 0 To UBound(ArrayDataDec)
            TextRecupe = TextRecupe & CStr(Dec_Bin8(CInt(ArrayDataDec(TT)))) & " "
        Next TT
        TextRecupe = Left(TextRecupe, Len(TextRecupe) - 1)
        Text1.Text = TextRecupe
    End Sub
     
    Private Sub Command3_Click()
        If Trim(Text2.Text) = "" Then Exit Sub
        Dim ArrayDataCaract() As String
        ArrayDataCaract = Split(Trim(Text2.Text), " ")
        TextRecupe = ""
        For TT = 0 To UBound(ArrayDataCaract)
            If CInt(ArrayDataCaract(TT)) = 0 Then
                TextRecupe = TextRecupe & "NULL"
                Else
                TextRecupe = TextRecupe & Chr(CInt(ArrayDataCaract(TT)))
            End If
        Next TT
        Text3.Text = TextRecupe
    End Sub
     
    Private Sub Command4_Click()
        If Trim(Text3.Text) = "" Then Exit Sub
        Dim StrSoumis As String
        StrSoumis = Trim(Text3.Text)
        TextRecupe = "": Text2.Text = ""
        For TT = 1 To Len(StrSoumis)
            If (TT - 4) <= Len(StrSoumis) Then
                If Mid(StrSoumis, TT, 4) = "NULL" Then
                    TextRecupe = TextRecupe & "0 ": TT = TT + 3
                    Else
                    TextRecupe = TextRecupe & AscW(Mid(StrSoumis, TT, 1)) & " "
                End If
                Else
                TextRecupe = TextRecupe & AscW(Mid(StrSoumis, TT, 1)) & " "
            End If
        Next TT
        TextRecupe = Left(TextRecupe, Len(TextRecupe) - 1)
        Text2.Text = TextRecupe8
    End Sub
    Dans le TextBox du haut tu peux y mettre différent octets sur 8 bits en les séparent par un caractère espace (" ") , en cliquant sur le premier CommandButton tu obtiens la conversion en décimale, puis en cliquant sur le bouton ^-- Ascii ---> caractère --v tu obtiens la conversion en caratères.
    Inversement, tu peux partir du TextBox le plus bas pour écrire du texte pour le convertir en code ascii puis en équivalence octets sur 8bits.
    A savoir, un octet égal à null (00000000) sera converti en un mot égal à NULL, inversement si tu veux obtenir un octet 00000000 tu écris NULL dans le TextBox le plus bas, ce qui donne 0 (zéro) en décimale et 00000000 en octet 8bits.

    Si tu entre: 016 002 067 032 003 002 196 009 196 009 020 000 118 016 003 dans le TextBox du milieu, tu obtiens 00010000 00000010 01000011 00100000 00000011 00000010 11000100 00001001 11000100 00001001 00010100 00000000 01110110 00010000 00000011 pour la conversion octets et voir l'image pour la conversion en caractères.
    Nom : Image.jpg
Affichages : 9
Taille : 72,3 Ko
    ProgElecT
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

Discussions similaires

  1. Données binaires
    Par GregPeck dans le forum PHP & MySQL
    Réponses: 3
    Dernier message: 12/11/2005, 23h40
  2. Manipulation de données binaires
    Par Defre87 dans le forum Général Python
    Réponses: 3
    Dernier message: 28/09/2005, 16h16
  3. Problème avec les données binaire
    Par Lachessis dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/08/2005, 17h38
  4. Données ASCII et données binaires
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2005, 12h19
  5. [VB6] mscomm
    Par Persons dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 09/10/2004, 10h04

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