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 :

[win32] CommTimeouts et port parallèle (suite)


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut [win32] CommTimeouts et port parallèle (suite)
    Bonjour à tous,

    je bloque depuis quelque temps sur un problème, et je commence à me demander si je vais réussir à trouver une solution. Je vais donc vous exposer mon problème proprement:

    système: windows 2000 pro.
    IDE: visualC++ 7.1

    J'ouvre le port parallèle vie un CreateFile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    m_hPortHandle = CreateFile("LPT1",					// device name
    								GENERIC_READ|GENERIC_WRITE,			// access mode
    								0,						// share mode
    								0,						// security attributes
    								OPEN_EXISTING,			// creation dispositions
    								FILE_ATTRIBUTE_NORMAL,	// flags and attributes
    								NULL);					// template file
    	if (m_hPortHandle==INVALID_HANDLE_VALUE)
    	{
    		ReportLastError("CreateFile"); //excellente fonction de debuggage récupérée sur codeguru.com
    		return FALSE;
    	}
    Le FileCreate() fonctionne et je n'obtiens pas de message d'erreur. Mon m_hPortHandle est valide.

    Ensuite, j'essaie d'appliquer les timeouts:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    COMMTIMEOUTS cto;
    cto.ReadIntervalTimeout = 2000;
    cto.ReadTotalTimeoutConstant = 0;
    cto.ReadTotalTimeoutMultiplier = 0;
    cto.WriteTotalTimeoutConstant = 0;
    cto.WriteTotalTimeoutMultiplier = 0;
    if (0==SetCommTimeouts(m_hPortHandle, &cto))
    {
    	ReportLastError("SetCommTimeouts");
    	return FALSE;
    }
    Et là, à l'appel de SetCommTimeouts j'obtiens: error 87: paramètre invalide (j'aimerais bien savoir lequel. J'ai essayé de rentrer en pas à pas dans la fonctio SetCommTimeouts <F11>, mais ça ne marche pas).

    J'ai essayé différentes ruses pour me passer de ces timeouts, mais rien n'y fait. Si ces timeouts ne sont pas correctements configurés, j'obtiens de gros soucis par la suite sur les ReadFile().

    Que se passe-t-il? Oublie-je quelque chose? Mon problème n'a-t-il donc point de solution?

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je sais que y'a des limitations sur le port parallele, mais j'ai jamais vraiment trouvé des infos là dessus (une histoire de spooler je crois, ou de driver imprimante qui est ouvert au lieu du driver LPT).
    Bref, je ne sais pas si SetCommTimeouts est supporté par le port parallèle.
    Tourne toi donc plutôt vers la lecture asynchrone, => utilise le dernier paramètre de ReadFile (créer avec FILE_FLAG_OVERLAPPED). Ainsi ReadFile / WriteFile rendront tout de suite la main et tu pourras déterminer le timeout via WaitForSingleObject.

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    ok

    je vais essayer ça

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    erf, ça ne marche pas. Le port parallèle ne supporte pas le mode asynchrone (overlapped).

    En revanche, j'ai trouvé une dll (http://www.logix4u.cjb.net/) qui permet de lire/ecrire sur le port parallèle, mais je n'arrive pas à la faire fonctionner

    Elle utilise des choses que je ne connais pas: CreateService, OpenService, StartService, etc. Mais aussi FindResource, LoadResource et LockResource (sur un fichier binaire)...

    Je ne suis pas encore couché moi...

  5. #5
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Oui, on arrive à la solution qui est toujours citée : le driver. Cette dll va installer un driver et s'en servir pour communiquer avec le port parallèle.
    Necessite d'être administrateur pour pouvoir charger le driver...
    D'autres drivers:
    http://www.lvr.com/parport.htm#Programming

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Je voudrais essayer quelque chose avant de me lancer dans les drivers. Tu dis:
    Citation Envoyé par Aurelien.Regat-Barrel
    ... et tu pourras déterminer le timeout via WaitForSingleObject.
    comment fait-on? Je n'arrive pas à comprendre l'utilisation de WaitForSingleObject

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    toutes mes excuses, j'avais mal compris!!
    Citation Envoyé par r0d
    Le port parallèle ne supporte pas le mode asynchrone (overlapped).
    C'est faux!!!

    Ca marche mais (malheureusement, il y a toujours un 'mais') j'obtiens un comportement des plus étranges: ma fonction WriteFile(...) me retourne un message d'erreur ("une opération d'entrée/sortie avec chevauchement est en cours d'exécution"), mais il écrit tout de même les données sur le port parallèle!

    De plus, je ne fais aucune autre opération sur le port:
    - ça ne peut pas être une autre application, mais je n'ai que visual qui tourne.
    - je ne fais aucun ReadFile (pour l'instant) dans mon appli
    - le WriteFile est dans une thread qui s'auto-detruit après le WriteFile (et puis de toutes façon, ma fonction qui appelle WriteFile n'est appelée qu'une seule fois).

  8. #8
    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
    si le mode overlapped fonctionne ,inspire toi de la classe du port serie de la faq ,pour la gestion de la lecture /ecriture.

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    L'erreur est normale. Ce n'est pas une vrai erreur, des données st en cours d'ecriture.
    En fait tu check si getlasterror == 0x87 et tu fait un WaitForSingleObject sur l'evenement d'overlap.
    Dès qu'il est signalé tes données sont écrites.

    Au fait, tu peux pas entrer dans setcommtimeout, c'est une API Windows.

  10. #10
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    C'est expliqué dans la MSDN. Notamment à la fin de:
    http://msdn.microsoft.com/library/en-us/fileio/fs/readfile.asp

  11. #11
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    ça y est, j'y suis arrivé!!! ouf... j'étais limite nervous breakdown là
    un gros à tous

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

Discussions similaires

  1. Gestion du port paralléle sous 2000
    Par kardex dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/01/2006, 19h47
  2. [C#] Communication avec les ports parallèle et RS232
    Par jejerome dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/07/2004, 22h57
  3. Port parallèle et ou logique
    Par declencher dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2004, 19h02
  4. ecriture vers le port parallèle
    Par Luther13 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 19/03/2004, 22h46
  5. Port Parallèle EPP ou ECP, hardware vs software ?
    Par TONIAPEL dans le forum Assembleur
    Réponses: 3
    Dernier message: 21/08/2003, 01h39

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