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 :

[API win32 sans MFC] Evenement: arrivée de données port série


Sujet :

MFC

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut [API win32 sans MFC] Evenement: arrivée de données port série
    Bonjour à tous,

    Je travaille avec embedded UNICODE pour développer pour windows CE.
    J'arrive à récuperer les données arrivées sur le port COM en cliquant sur un bouton,
    Or j'aimerais récuperer l'evenement d'arrivées de données pour automatiser la chose.

    J'ai essayé en bricolant de moi même, je n'y suis pas arrivé, je viens donc de prendre ce code:
    http://c.developpez.com/faq/vc/?page...WithSerialPort

    Mais il y a des erreurs du style:
    error C2065: 'BuildCommDCB' : undeclared identifier
    error C2065: 'GetOverlappedResult' : undeclared identifier
    error C2065: 'AfxBeginThread' : undeclared identifier

    Comme s'il manquait un bibliothèque... Mais tout devrait se trouver dans windows.h qui est déjà incluse.

    Pourquoi ce code ne marche pas ?
    Est ce que quelqu'un peut me dire comment (simplement) attacher un evenement au port COM ?

    Merci d'avance.

    Voici mon code bricolé qui ne marche pas:
    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
    int ouvrirPort(int numport) { // Retourne 1 en cas de succès
        //char szPort[16];
    	TCHAR szPort[15];
        //sprintf(szPort, "\\\\.\\COM%d:", numport);//modifie pour prendre les port com>9
    	wsprintf(szPort, _T("COM%d:"), numport);
    	hPort = CreateFile(
    		(LPCTSTR)szPort,							//Pointer to the name of the port
    		GENERIC_READ|GENERIC_WRITE,		//accès en lecture ou en écriture
    		0,                             //Share mode
    		NULL,                          //Pointer to the security attribute
    		OPEN_EXISTING,                 //Cela indique que l'instance sera créée si que le port existe
    		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //Port attributes
    		NULL);
     
    	if(hPort==INVALID_HANDLE_VALUE) {
    		return 0;
    	}
     
    	if(!m_Ov.hEvent)
            m_Ov.hEvent=CreateEvent(NULL,   // no security attributes
                                    FALSE,  // auto reset event
                                    FALSE,  // not signaled
                                    NULL    // no name
                                    );
     
        SetEvent(m_Ov.hEvent);
     
     
    	DCB PortDCB;
    	if (!GetCommState (hPort, &PortDCB)) { // Structure de configuration
    		return 0;
    	}
    	// mise à jour de la structure
    	PortDCB.DCBlength = sizeof (DCB); 
    	PortDCB.BaudRate = 9600; 
    	PortDCB.fBinary = TRUE; 
    	PortDCB.fParity = TRUE; 
    	PortDCB.fOutxCtsFlow = FALSE; 
    	PortDCB.fOutxDsrFlow = FALSE; 
    	PortDCB.fDtrControl = DTR_CONTROL_ENABLE; 
    	PortDCB.fDsrSensitivity = FALSE; 
    	PortDCB.fTXContinueOnXoff = TRUE; 
    	PortDCB.fOutX = FALSE; 
    	PortDCB.fInX = FALSE; 
    	PortDCB.fErrorChar = FALSE; 
    	PortDCB.fNull = FALSE; 
    	PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
    	PortDCB.fAbortOnError = FALSE; 
    	PortDCB.ByteSize = 8; 
    	PortDCB.Parity = NOPARITY; 
    	PortDCB.StopBits = ONESTOPBIT; 
     
    	//Renvoie des nouvelles informations dans le registre de votre port série
    	if (SetCommState (hPort, &PortDCB)) {
    		GetCommTimeouts(hPort,&m_ComTimeouts);
    		m_ComTimeouts.ReadIntervalTimeout = 0xFFFFFFFF;
    		m_ComTimeouts.ReadTotalTimeoutMultiplier = 0;
    		m_ComTimeouts.ReadTotalTimeoutConstant = 0;
    		m_ComTimeouts.WriteTotalTimeoutMultiplier = 0;
    		m_ComTimeouts.WriteTotalTimeoutConstant = 10000;
    		if (!SetCommTimeouts(hPort,&m_ComTimeouts))
    			return 0;
    		memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
    		m_OverlappedRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
    		memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));
    		m_OverlappedWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
    		if (m_OverlappedRead.hEvent==NULL || m_OverlappedWrite.hEvent==NULL)
    			return 0;
    		if(m_OverlappedRead.hEvent!=NULL) 
    			CloseHandle(m_OverlappedRead.hEvent);
    		if(m_OverlappedWrite.hEvent!=NULL) 
    			CloseHandle(m_OverlappedWrite.hEvent);
     
    		// PRM2: Indique que l'on va détecter la réception (entrée de type DWORD)
    		SetCommMask(hPort,EV_RXCHAR); // définit les évènements pour lesquels ont va réagir par rapport à notre instance
    		return 1;
    	} else
    		return 0;
     
    }

  2. #2
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    hé bien c'est une grande question !
    Apparemment BuildCommDCB et GetOverlappedResult ne sont pas supportées par WinCe du coup pas de gestion du mode Overlapped (asynchrone) possible.

    je n'ai pas trouvé l'equivalent de ces fonctions, avis aux amateurs ....

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 100
    Points
    100
    Par défaut
    Salut,

    Il y a un article la dessus sur CodePPC ici.

  4. #4
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour farscape,

    C'est quoi la grosse différence entre sychrone et asynchrone?
    Je vois partout que asynchrone c'est mieux, mais jamais de courte définition.

    Bonjour VitamineC,

    Cet article, je le connais par coeur, en ce moment, je passe mes jours et mes nuits sur ce site.
    Seulement, si ça m'a beaucoup aidé pour lire les données... Il n'y a rien concernant les evenements liés aux ports COM.

    J'ai lu que WaitCommEvent savait le gérer mais comment l'utiliiser ?

    Merci.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 100
    Points
    100
    Par défaut
    WaitCommEvent est bloquant donc il faut le placer dans un thread et fixer, probablement, le masque sur EV_RXCHAR si tu ne veux gerer que la lecture.

  6. #6
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Oui, je m'était aperçu qu'il était bloquant...
    Ce comportement me dérange vraiment !

    Seulement, je ne sais pas comment fonctionnent les threads...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 100
    Points
    100
    Par défaut
    Pour les threads en eVC : ici
    AfxBeginThread fonctionne avec les mfc...

  8. #8
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Merci, je verrais ça demain et je valide.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    la transmission asynchrone n'est pas bloquante :
    Citation Envoyé par faq
    les opérations sont placées en file d'attente par le système et traitées dés que possible.
    le hic c'est que sans cette fonction (GetOverlappedResult) je ne sais pas comment faire ...
    en mode synchrone tant que les caractères ne seront pas envoyés le programme attend ....
    Pour la réception la possibilité de perdre des caractères est plus élevée.
    Alors soit il y a une grosse astuce, soit ce n'est pas possible.
    Mais le sujet m'intrigue car tu n’es pas le premier à me poser le problème...

  10. #10
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    D'autant plus que je ne demande pas quelque chose hors du commun...

    Mais rassures moi... Ce que je veux peut être fait en mode synchrone avec des threads comme indiqué ci-dessus ?

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    tu es obligé de travailler en serie pur ?
    tu ne peux pas établir une connexion distante tcp-ip sur port serie ? et donc utiliser les sockets pour ton transfert ,voir ftp.?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 100
    Points
    100
    Par défaut
    Le mode overlapped n'est pas supporté sur CE, comme l'a indiqué farscape,
    donc tu dois travailler en synchrone.

    Farscape : Pourquoi penses tu que ce mode présente un risque plus élevé niveau perte de données ?

  13. #13
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour farscape,

    Je ne connais pas d'autres moyen d'avoir les données du port série que de passer par... le port série.

    Il y a moyen de les attraper via TCP-IP ?

  14. #14
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    Parce qu'il est bloquant,pas de file d'attente et que ça va dépendre du materiel (de l'uart utilisée de son tampon interne).
    donc si le programme n'est pas pret à lire au moment voulu, il y a un risque de perte de données.
    donc je me demande comment ils font en interne sur CE il doit bien y a avoir une solution.
    d'ou ma question de passer par un connexion distante et de travailler en tcp-ip / socket.

Discussions similaires

  1. Faire appel aux API Win32 sans IAT
    Par yannguibet dans le forum x86 32-bits / 64-bits
    Réponses: 8
    Dernier message: 01/08/2008, 16h21
  2. [API Win32 sans MFC] pb BuildCommDCB
    Par dacid dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 24/05/2006, 18h04
  3. [API Win32 sans MFC] Lecture port série: thread bloqué
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/05/2006, 13h34
  4. [API Win32 sans MFC] Ajouter et récuperer du texte d'un EDIT
    Par dacid dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 17/05/2006, 17h45
  5. [API win32 sans MFC] Création textbox et evenement bouton
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 17/05/2006, 11h03

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