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

Visual C++ Discussion :

Paramètrage Liaison Série C++


Sujet :

Visual C++

  1. #1
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut Paramètrage Liaison Série C++
    Salut,

    J'ai un petit souci...

    Je commence à écrire ma fonction de configuration du port et j'ai un problème déclaration de m_dcb...

    Voilà je ce que j'ai fais dans le .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BOOL CComSerie::ConfigurePort(DWORD BaudRate, BYTE ByteSize,
    							  DWORD fParity, BYTE Parity,
    							  BYTE StopBits)
     
    {
    	if((m_bPortReady = GetCommState(hComm, &m_dcb))==0)
    	{
    		MessageBox("GetCommState Error","Error",MB_OK);
    		CloseHandle(hComm);
    		return false;
    	}
     
     
    }

    et ce que j'ai déclaré dans le .h :


    et j'ai l'erreur :

    error C2664: 'GetCommState' : cannot convert parameter 2 from 'struct _DCB ** ' to 'struct _DCB *'


    Est-ce que quelqu'un pourrait m'expliquer, merci...

  2. #2
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Pour info, dans le constructeur j'ai intialisé :

    et dans le destructeur :


  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    hé bien c'est normal non ?
    le compilateur t'indique que ta variable est déjà un pointeur et qu'il attend l'adresse d'une variable et non l'adresse d'un pointeur...
    enleve le & .

  4. #4
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Merci Farscape...

    J'ai donc continué à coder et j'ai une exception...

    Voilà ce que j'ai fais :

    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
    BOOL CComSerie::OpenPort(CString portname)
    {
    	portname= "//./" + portname;
     
    	hComm = CreateFile(portname,
                          GENERIC_READ | GENERIC_WRITE,
                          0,
                          0,
                          OPEN_EXISTING,
                          0,
                          0);
    	if(hComm==INVALID_HANDLE_VALUE)
    	{
    		return false;
    	}
    		else
    		return true;
     
    }
     
     
    BOOL CComSerie::ConfigurePort(DWORD BaudRate, BYTE ByteSize,
    							  DWORD fParity, BYTE Parity,
    							  BYTE StopBits)
     
    {
    	if((m_bPortReady = GetCommState(hComm, m_dcb)) == 0)
    	{
    		//MessageBox("Erreur de configuration du port série","Erreur",MB_OK);
    		CloseHandle(hComm);
    		return false;
    	}
     
    	m_dcb->BaudRate = BaudRate;
    	m_dcb->ByteSize = ByteSize;
    	m_dcb->Parity = Parity;
    	m_dcb->StopBits = StopBits;
    	m_dcb->fBinary = true;
    	m_dcb->fDsrSensitivity = false;
    	m_dcb->fParity = fParity;
    	m_dcb->fOutX = false;
    	m_dcb->fInX = false;
    	m_dcb->fNull = false;
    	m_dcb->fAbortOnError = true;
    	m_dcb->fOutxCtsFlow = false;
    	m_dcb->fOutxDsrFlow = false;
    	m_dcb->fDtrControl = DTR_CONTROL_DISABLE;
    	m_dcb->fDsrSensitivity = false;
    	m_dcb->fRtsControl = RTS_CONTROL_DISABLE;
     
    	if((m_bPortReady = SetCommState(hComm, m_dcb)) == 0)
    	{
    		//MessageBox("Erreur de configuration du port série","Erreur",MB_OK);
    		CloseHandle(hComm);
    		return false;
    	}
     
    	return true;
     
    }
     
     
    BOOL CComSerie::ReadByte(BYTE &resp)
    {
    	BYTE rx;
    	resp = 0;
     
    	DWORD dwBytesTransferred = 0;
     
    	if(ReadFile(hComm, &rx, 1, &dwBytesTransferred, 0))
    	{
    		if(dwBytesTransferred == 1)
    		{
    			resp = rx;
    			return true;
    		}
    	}
    return false;
    }
     
     
    BOOL CComSerie::WriteByte(BYTE bybyte)
    {
    	LPDWORD iBytesWritten = 0;
    	if(WriteFile(hComm, &bybyte, 1, iBytesWritten, NULL) == 0)
    		return false;
    	else return true;
     
    }
     
     
    void CComSerie::ClosePort()
    {
    	CloseHandle(hComm);
    	return;
    }
    L'expeption se produit au WriteFile et est lié à KERNEL32.DLL,
    Je ne vois pas d'où viens le problème d'autant plus que la compilation de me signale rien du tout...

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    heu tu sais que dans la faq il y a une classe qui fait le boulot ?,
    si tu veux faire ça de ton coté ok ,mais inspire toi au moins d'un code qui fonctionne....
    la compilation et une exception à l'exécution sont deux choses différentes
    un programme qui compile ne sera pas pour autant exempt de bug....

  6. #6
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    OK je vais m'en inspirer...

  7. #7
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Je me sert maintenant de ta classe FarScape qui est vraiment complète...

    J'ai juste un problème quand je fais un PortOpen(); , elle me renvoie ERREUR, car j'ai m_hCom qui est égal à 0xffffffff...

    Et je ne vois pas d'où cela peut venir...

  8. #8
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    J'ai fait beaucoup d'essais différents et toujours pareil....

    Je ne comprends pas, si quelqu'un a déjà eu le même problème...

    Merci de me venir en aide...

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    sans ligne de code correspondante ,difficile de repondre ...

  10. #10
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Je fais un appel à la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    BOOL Erreur = ComS->PortOpen(1,9600,'N',1,1);
    if(Erreur == false) MessageBox("Erreur","Erreur",MB_OK);
    Vers la classe CCom :

    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
    bool CCom::PortOpen(int portnumber,long baudrate,char parity,int wordlength,int stopbits)
    {
       //
        char sz[20];
        m_nInputBufferSize=1050;
        m_nOutputBufferSize=1050;
     
        memset(&m_Ov,0,sizeof(m_Ov));
     
        wsprintf( sz, "\\\\.\\COM%d", portnumber);   
        m_hCom = CreateFile( sz,
            GENERIC_READ | GENERIC_WRITE,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_FLAG_OVERLAPPED,
            NULL );
     
        if ( m_hCom == INVALID_HANDLE_VALUE )
        {
            GetError();
            return false;
        }    etc....

    Et en pas à pas, aprés l'exécution du CreateFile j'ai m_hCom = 0xfffffffff et cela retourne false...

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    que renvoie GetStringError() ?

  12. #12
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    GetStringError() me renvoie "paramètre incorrect"

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    effectivement je viens de voir que tu as mis 1 bit de data ,au lieu de 8 généralement ....

  14. #14
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Merci FarsCape tu as raison...

    Mais j'ai une question, aurais tu le descriptif des erreurs retourné par la fonction GetLastError() ?

  15. #15
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    voir WINERROR.H.

  16. #16
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Ok merci pour tout...

  17. #17
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    En fait j'ai encore un petit souci....

    J'arrive bien a ouvrir le port, le fermer et envoyer des données...

    Mais j'ai un problème avec la lecture...

    Si je fais un SizeUsedInRXBuf(), je retrouve la taille de la trame envoyée, et donc ensuite je fais un ReadBuffer() et là déjà le ReadFile() me renvoie 0, et ça plante à la fonction GetOverlappedResult()..

    J'ai fait pas mal d'essais differents et toujours pareil....

    Si qquelqu'un à déjà eu ce problème...

  18. #18
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Cà y est j'ai trouvé..

    En fait, avant d'appeller la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadBuffer(Char *Buffer,unsigned int ucount);
    j'avais déclaré le buffer comme :

    puis je l'avais appellé comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadBuffer(Buffer,ucount);
    Alors ensuite j'ai essayé de le déclaré comme cela :

    Et là ça marche alors si quelqu'un peut m'expliquer ça serai sympa...

  19. #19
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    c'est les bases du C ...
    tu passes l'adresse d'un pointeur non initialisé (qui ne pointe sur rien )à la fonction ReadBuffer, ce qui devrait provoquer un plantage du programme.

    l'autre version tu passes l'adresse d'un buffer valide donc c'est normal que ça fonctionne...

  20. #20
    Membre éclairé Avatar de Fred2209
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    D'accord Ok Merci FarsCape...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. liaison Série avec kernell32
    Par Emcy dans le forum Windows
    Réponses: 8
    Dernier message: 31/08/2005, 08h58
  2. Réponses: 7
    Dernier message: 21/06/2005, 16h56
  3. [Debutant(e)] Liaison série RS232 et servlet
    Par bourack dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/01/2005, 14h50
  4. Réponses: 29
    Dernier message: 11/05/2004, 13h18
  5. liaison série
    Par elodie escande dans le forum MFC
    Réponses: 13
    Dernier message: 14/01/2004, 17h57

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