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

Windows Discussion :

liaison Série avec kernell32


Sujet :

Windows

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut liaison Série avec kernell32
    Bonjours,

    je recherche la valeur des de toutes les constantes DCB (kernell)

    ex : qu'elle valeur dois-je mettre dans la propriété "StopBits" pour indiquer que le port série doit avoir 2 bit de stop ?

    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
    Public Structure DCB
       		Public DCBlength As Int32
    		Public BaudRate As Int32
    		Public fBitFields As Int32 'See Comments in Win32API.Txt
    		Public wReserved As Int16
    		Public XonLim As Int16
    		Public XoffLim As Int16
    		Public ByteSize As Byte
    		Public Parity As Byte
    		Public StopBits As Byte
    		Public XonChar As Byte
    		Public XoffChar As Byte
    		Public ErrorChar As Byte
    		Public EofChar As Byte
    		Public EvtChar As Byte
    		Public wReserved1 As Int16 'Reserved; Do Not Use
    	End Structure

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    http://msdn.microsoft.com/library/en-us/devio/base/dcb_str.asp
    StopBits
    Number of stop bits to be used. This member can be one of the following values.Value Meaning
    ONESTOPBIT
    0 1 stop bit.
    ONE5STOPBITS
    1 1.5 stop bits.
    TWOSTOPBITS
    2 2 stop bits

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    Merci pour ton aide

    pour géré ma liaison j'ai utiliser le programme suivant :
    http://support.microsoft.com/default.aspx/kb/823179/fr

    le propriété fBitFields n'est pas dans la liste que tu m'a donnée => à quoi sert-elle ?

    Depuis que j'ai rajouté les propriétés manquante dans mon programme, j'ai des erreur dans la partie écriture de la configuration de la liaison. D'où vient l'erreur ?

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Si tu regardes bien la structure DCB en C, elle est définie ainsi vers le début:
    typedef struct _DCB {
    DWORD DCBlength;
    DWORD BaudRate;
    DWORD fBinary :1;
    DWORD fParity :1;
    DWORD fOutxCtsFlow :1;
    DWORD fOutxDsrFlow :1;
    DWORD fDtrControl :2;
    DWORD fDsrSensitivity :1;
    DWORD fTXContinueOnXoff :1;
    DWORD fOutX :1;
    DWORD fInX :1;
    DWORD fErrorChar :1;
    DWORD fNull :1;
    DWORD fRtsControl :2;
    DWORD fAbortOnError :1;
    DWORD fDummy2 :17;
    WORD wReserved;
    Note les :1, :2, :17 ... ca veut dire que ce champ occupe 1, 2 ou 17 bits (et non pas octet, mais bien des bits).
    En clair, tous ces champs (de fBinary à fDummy2) sont regroupés dans un seul DWORD (32 bits) et le compilo C s'arrange pour accéder chaque bit demandé.
    En VB on peut pas faire ça. Alors le mec a regroupé tous ces champ en un seul Int32, appelé fBitFields. Donc faut pas toucher à la structure, elle est ok.
    Pour en modifier un en particulier, il faut déterminer son numéro de bit(s) et faire de la logique binaire pour modifier uniquement ces bits.
    Par exemple fOutxDsrFlow est le 4° bit.
    4° bit => bit3 => 2 puissance 3 => 8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Pour mettre fOutxDsrFlow à 1:
    fBitFields = fBitFields OR 8
    (je connais pas VB, OR = ou binaire)

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    je crois que je comprends (un peu) mieux.

    Comment je fais pour savoir à quel bit correspond tel fonction ?


    On peut activer les bit suivant en même temps ?
    fRtsControl
    fOutxCtsFlow
    fOutxDsrFlow
    fDsrSensitivity
    fOutX
    fInX
    => c'est à dire que ça active plusieurs mode de flux différent en même temps

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Pour connaitre le numero de bit c'est facile : il faut suivre le même ordre que dans la structure et additionner les bits précédents.
    fBinary => bit0
    fParity vient après fBinary => bit1
    fOutxCtsFlow => bit2
    fOutxDsrFlow => bit3
    fDtrControl => bit4 et bit5
    etc...
    Oui tu peux tout initialiser en un coup dans ton cas. Il te faut définir la valeur de chacun de ces bits, puis écrire le nombre en binaire et en déduire sa valeur (décimale ou hexa comme tu veux).
    Note que le bit0 est le plus à droite.
    Exemple:
    fBinary = 0
    fParity = 1
    fOutxCtsFlow = 1
    fOutxDsrFlow = 0
    fDtrControl => 2 => 01
    ...
    ça donne en binaire : .../01/0/1/1/0 => 010110 = 22
    aide de toi de la calculette en more scientifique.

  7. #7
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    je viens de finir les procédures qui devraient fonctionner : peux tu me dire si tu vois des erreurs ?

    affectation de fDummy (17 bits) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Change la valeur des 17 derniers bits de fBitFields 
    	Private Sub SetfBitFieldsLast17(ByRef MyfBitFields As Int32, MyVal As Int32) 
    		
    		Dim Masque As Int32
    		Masque = 32767
    		Masque = Not Masque
    		MyfBitFields =  MyfBitFields And Masque 'mise à zéro des 17 bits de poids fort
    		
    		MyVal <<= 17 'decalage à gauche 
    		MyfBitFields = MyfBitFields Or MyVal 
    		
    	End Sub
    Changement de la valeur d'un bit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'Change la valeur du bit spécifié de fBitFields 
    	Private Sub SetfBitFieldsBoolean&#40;ByRef MyfBitFields As Int32, MyVal As Boolean, MyBitNumber As Int16&#41; 
    	
    		Dim Masque As Int32
    		Masque = CType&#40;2^MyBitNumber, Int32&#41;
    		
    		If MyVal = False Then 'affecte un 0 
    			Masque = Not Masque
    			MyfBitFields = MyfBitFields And Masque
    		Else 'affecte un 1
    			MyfBitFields = MyfBitFields Or Masque
    		End If
    	
    	End Sub
    changement de la valeur de 2 bits :
    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
    'Change la valeur des 2 bits spécifiés de fBitFields 
    	Private Sub SetfBitFieldsByte&#40;ByRef MyfBitFields As Int32, MyVal As Byte, MyStartBitNumber As Int16&#41; 
    		
    		Dim Bit0, Bit1 As Boolean
    		
    		Select MyVal
    			Case 0
    				Bit0 = False
    				Bit1 = False
    			Case 1
    				Bit0 = True
    				Bit1 = False	
    			Case 2
    				Bit0 = False
    				Bit1 = True
    			Case 3
    				Bit0 = True
    				Bit1 = True
    			Case Else
    				Exit Sub
    		End Select
    		
    		SetfBitFieldsBoolean&#40;MyfBitFields, Bit0, MyStartBitNumber&#41;
    		SetfBitFieldsBoolean&#40;MyfBitFields, Bit1, Ctype&#40;MyStartBitNumber + 1,Int16&#41;&#41;
    		
    	End Sub

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Je comprends pas ta fonction SetfBitFieldsLast17, ni même à quoi elle sert (on s'en fiche de ces bits là, ils sont pas utilisés, tu mets fBitFields à 0 au début et puis voilà).

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    ma fonction permet de ne changer la valeur que des 17 derniers bits de fBitFields ce qui correspond à l'emplacement de fDummy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Masque = 32767 'crée un masque avec les 15bits de poids faible à 1 &#40;le reste à 0&#41;
    
    Masque = Not Masque 'modifie le masque &#58; 17bits de poid fort à 1 et le reste à 0
    => il faut supprimer cette ligne je me suis trompé dans le prog
    
    MyfBitFields =  MyfBitFields And Masque 'mise à zéro des 17 bits de poids fort sans modifier la valeur des 15bits de poids faible
    
    'MyVal est la valeur de fDummy
    MyVal <<= 17 'decalage à gauche pour que le positionnement corresponde avec celui de MyfBitFields
    
    MyfBitFields = MyfBitFields Or MyVal  'modification des 17bits de poids fort de MyfBitFields
    Mon but est de pouvoir modifier seulement les bits qui m'interesse => avec ta méthode, je suis obligé de définir tous les bits de fBitFields

Discussions similaires

  1. [Port série] Liaison série avec Qt
    Par krapo13 dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/02/2011, 15h41
  2. Liaison série avec une imprimante Imaje(S8)
    Par laeti23 dans le forum C#
    Réponses: 0
    Dernier message: 29/12/2008, 15h39
  3. gestion de la liaison série avec VBA
    Par riquet90 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 11/08/2008, 17h30
  4. liaison série avec interruption
    Par eight85 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 30/08/2007, 08h28
  5. Réponses: 4
    Dernier message: 30/03/2007, 16h27

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