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

MFC Discussion :

Lecture à partir du port série et écriture dans une textbox


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut Lecture à partir du port série et écriture dans une textbox
    Bonjour!! (encore moi mais pour la question inverse)

    alors voila je souhaite recevoir des valeurs envoyées sur mon port série et les écrire dans un textbox lorsque je clique sur un bouton receive.

    J'ai fait ca :
    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
     
    void CComIHMDlg::OnBnClickedReceive()
    {
    	// TODO: Add your control notification handler code here
     
     
    	TCHAR cBuffer[512];
    	DWORD *pnb_lus [2];
     
     
    	ReadFile(hcom, cBuffer, 2 , (LPDWORD)pnb_lus, NULL);
     
     
    	// recuperation l'edit box.
    	CEdit* edit=(CEdit*) GetDlgItem(IDC_EDIT2);
     
    	edit->SetWindowTextW((LPCTSTR)cBuffer);
     
     
    }
    Bon alors quand je clique sur le bouton receive je ne reçois que des carrés quelque soit la valeur envoyé. Je crois qu'en unicode cela correspond à une ligne vide non ?? je suis un peu perdue ...
    Si vous pouvez m'aider je suis preneuse!!

    Merci d'avance!!

  2. #2
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    tu mélanges les TCHAR, les char et les wchar_t ....

    déjà de ta ligne série, tu reçois quoi comme type de caractères ? un char (1 octet = 1 caractère) ou un wchar_t (2 octets = 1 caractère)

    parce que là, dans ton code, ça va dépendre de la compilation de ton programme (le fait que _UNICODE soit défini ou pas) et non de ton partenaire de communication ...

    a mon humble avis, ta ligne série reçois que du "char".

    @+

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Oui t'as tout compris je suis trop perdue entre les wchar_t, les char et tout.

    Parce que en fait je reçois de l'unicode... je comprends pas pourquoi ...

    Si tu veux j'aimerai utiliser les fonctions du type SetWindowTextA et non pas SetWindowTextW mais je peux pas.

    Pourtant je n'ai pas fait de define Unicode ni rien. Est ce par défaut ?
    Quand je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define SetWindowTextA SetWindowText
    j'ai le message d'erreur suivant à la compilation : SetWindowText is not a member of Cedit

    Peux tu m'éclairer un peu ?

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Je l'ai refait en un peu plus clair :
    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
     
    void CComIHMDlg::OnBnClickedReceive()
    {
    	// TODO: Add your control notification handler code here
    	char *buffer;
    	DWORD *pnb_lus;
    	BOOL retour;
     
    	pnb_lus = 0;
    	buffer = 0;
     
    	retour = ReadFile( hcom , buffer , 10 , pnb_lus , NULL );
     
    	// recuperation l'edit box.
    	CEdit* edit=(CEdit*) GetDlgItem(IDC_EDIT2);
     
    	edit->SetWindowText((LPCTSTR)buffer);
     
    	if (retour != 1)
    	edit->SetWindowText(_T("noob"));	
    }
    je reçois bien noob :/ :/ je vois pas ce qui peut clocher !!

  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
    salut,
    ton code doit planter (du moins en release)
    tu fournis a ReadFile un pointeur qui n'adresse aucun bloc de mémoire....
    buffer être déclarer comme un tableau de char avec une taille fixée.

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Même si je déclare buffer de cette façon je ne reçois rien .

    Tu pensais le déclarer d'une autre façon ?

  7. #7
    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
    oui pas comme ça !
    ceci dit ta manière de travailler avec le port serie ne vas pas aller loin...
    j'ai fais un post dans la faq sur ce sujet.

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Bon j'ai passé tout le weekend à étudier ton post dans la faq qui est trés intéréssant ,mais je n'arrive toujours pas à recevoir des données venant de mon port com.

    je te montre ce que je fais:

    d'abord j'initialise le port :
    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
     
    BOOL CComIHMDlg::InitPortCom()
    {
    	//Nom du port série auquel on veut accéder 
    	char PortName[20];
     
    	wsprintf( PortName, "\\\\.\\COM%d", 6);   
     
     
    	//Nom du port série auquel on veut accéder 
     
    	hcom = CreateFile(PortName, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING,
            NULL) ;
     
     
    	if ( hcom == INVALID_HANDLE_VALUE )
        {
            //GetError();
    		PortState = 1;
            return false;
        }   
     
    	//Parametrage des parametres de timeout
    	ctmo.ReadIntervalTimeout = MAXWORD;
    	ctmo.ReadTotalTimeoutMultiplier = 0;
    	ctmo.ReadTotalTimeoutConstant = 10;
    	ctmo.WriteTotalTimeoutMultiplier= 2*CBR_9600/CBR_9600;
    	ctmo.WriteTotalTimeoutMultiplier= CBR_9600;
    	ctmo.WriteTotalTimeoutConstant = 0;
    	SetCommTimeouts( hcom , &ctmo );
     
    	//Récupération et paramétrage du port COM
    	if(GetCommState(hcom, &dcb) != TRUE)
    		return FALSE;
    	dcb.DCBlength = sizeof( DCB ) ;
    	GetCommState( hcom , &dcb ) ;
    	dcb.BaudRate = CBR_9600;					// Vitesse de transmission
    	dcb.fBinary = TRUE;
    	dcb.fParity = TRUE;
    	dcb.fOutxCtsFlow = FALSE;                   // CTS output flow control
    	dcb.fOutxDsrFlow = FALSE;                   // DSR output flow control  
    	dcb.fDtrControl = DTR_CONTROL_ENABLE;		// DTR flow control type
    	dcb.fRtsControl = RTS_CONTROL_DISABLE;      // RTS flow control
    	dcb.fDsrSensitivity = FALSE;                // DSR sensitivity
    	dcb.fOutX = TRUE;							// XON/XOFF out flow control
    	dcb.fInX = FALSE;                           // XON/XOFF in flow control
    	dcb.fNull = FALSE;
     
    	dcb.fRtsControl = RTS_CONTROL_ENABLE; 
    	dcb.fAbortOnError = FALSE;
     
    	dcb.ByteSize = 8;							// 8 bit de donnee
    	dcb.Parity = NOPARITY;						// sans parité
    	dcb.StopBits = ONESTOPBIT;					// 1 bit de stop
    	SetCommState( hcom , &dcb ); 
     
    	//Purge du port COM
    	if(PurgeCom()!=TRUE)
    	return FALSE;
    	else
    		return TRUE;
     
    	}
    Ensuite j'écris ma fonction ReadBuffer:
    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
     
    int CComIHMDlg::ReadBuffer(char *cBuffer,unsigned int iSize)
    {
     
    	int result;
     
        COMSTAT comstat;
        DWORD comerr;
    	DWORD countread;
        DWORD countoread;
     
     
        ClearCommError( hcom, &comerr, &comstat );
    	if ( comerr > 0 ) m_comerr |= comerr;
     
    	 if ( comstat.cbInQue < iSize ) countoread = comstat.cbInQue;
            else                        countoread = iSize;
     
    	result = ReadFile( hcom, cBuffer, countoread, &countread, NULL);
            if ( result == FALSE )
            return(0);
     
    			// recuperation l'edit box.
    	CEdit* edit=(CEdit*) GetDlgItem(IDC_EDIT2);
     
    	edit->SetWindowText(cBuffer);
     
    	return(1);
    }
    et enfin je l'appel lorsque je clique sur le bouton receive:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void CComIHMDlg::OnBnClickedReceive()
    {
     
    	ReadBuffer(PortName,sizeof(PortName));
     
     
    }
    Je n'ai aucune erreur de compilation ni de warning. Ma fonction WriteBuffer fonctionne. Mais pas ma fonction ReadBuffer. Je ne reçois rien.
    Si quelqu'un voit pourquoi je suis preneuse!!

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    J'ai ajouté toute la partie thread et gestion Rx TX Purge Rx, purge Tx ...

    Et maintenant pendant l'éxecution, j'ai le problème suivant:

    Unhandled exception at 0x7e3bc1c1 in Com.exe: 0xC0000005: Access violation reading location 0xcccccccc.

    Je ne vois pas du tout a quoi il correspond

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Ah si j'ai trouvé c'est un problème de dépassement mémoire j'ai changé la taille du buffer.

    Bon par contre maintenant quand j'écris 45,98 sur le port je reçois 45,98ÌÌÌÌÌÌÌÌÌÌÌ
    problème d'unicode ?? problème de dépassement ??

  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
    salut,
    tout dépend comment tu affiches ton buffer ...
    si celui n'est pas initialisé a '\0' et que tu utilises un messagebox tu as de la friture derrière ...
    un buffer n'a aucune raison d'être initialisé correctement, si ta réception reçoit 45.98 il n'y a aucune raison d'avoir un '\0' derrière (sauf si tu l'envoies).

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Beennnn c'est louche parce que je n'utilise pas de messageBox mais une editBox. C'est pareil ?? Au niveau de mon buffer je fais ça finalement. Il faudrait que je définisse exactement la taille de ce que je dois envoyer.

    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
     
    //-----------------------------------------
    int CComIHMDlg::ReadBuffer()
    {
     
    	int result;
    	char cBuffer[512];
    	int	iSize=5 ;
     
        COMSTAT comstat;
        DWORD comerr;
        DWORD countread;
        DWORD countoread;
     
     
        ClearCommError( hcom, &comerr, &comstat );
    	if ( comerr > 0 ) m_comerr |= comerr;
     
    	 if ( comstat.cbInQue < iSize ) countoread = comstat.cbInQue;
            else                        countoread = iSize;
     
    		//PurgeCom();
     
     
    	result = ReadFile( hcom, cBuffer, countoread, &countread, &m_Ov );
            //if ( result == FALSE )
            //return(0);
     
     
    			// recuperation l'edit box.
    	CEdit* edit=(CEdit*) GetDlgItem(IDC_EDIT2);
     
    	if (result != TRUE)
    	edit->SetWindowText(_T("test"));
     
    	edit->SetWindowText(cBuffer);
     
    	return(1);
    }

  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
    hé bien tu fais exactement ce que j'ai dis qu'il ne fallait pas faire...
    tu envoies un buffer non initialisé (qui ne se termine pas par un '\0') dans ton edit.
    la méthode SetWindowText attend une chaine de caractères qui se termine par '\0'.

  14. #14
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Ayéééé il y a tout qui marche !!!!!
    En fait j'ai fait ces petits ajouts pour que le buffer soit bien "propre" en début et fin de chaine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	// initialisation du début de la chaine
    	cBuffer[0]='\0' ;
     
     
    	comstat.cbInQue = SizeUsedInRXBuf();
     
    	 if ( comstat.cbInQue < iSize ) countoread = comstat.cbInQue;
            else                        countoread = iSize;
     
    	//initialisation de la fin de chaine
    	cBuffer[countoread]='\0';

    Merci beaucoup à toi farscape surtout pour ton tuto dans la faq!!! Merci à stephdim également.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/11/2014, 10h56
  2. Lecture de donnée à partir de port série
    Par Sonda09 dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/09/2011, 15h38
  3. Problème d'écriture dans une TextBox
    Par jeremy5490 dans le forum C#
    Réponses: 6
    Dernier message: 09/06/2011, 11h28
  4. Réponses: 0
    Dernier message: 05/04/2011, 01h09
  5. [Kylix] Lecture sur le port série en C++
    Par MD Software dans le forum EDI
    Réponses: 1
    Dernier message: 08/05/2004, 12h52

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