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

VC++ .NET Discussion :

Gestion d'interruptions Visual C++ 2010


Sujet :

VC++ .NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Février 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur mécanique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 27
    Points : 18
    Points
    18
    Par défaut Gestion d'interruptions Visual C++ 2010
    Bonjour,

    Y a-t-il un moyen de générer une interruption lors de l'arrivée d'un message sur le port USB.
    A l'heure actuelle, je viens lire par un timer le port USB et je le traite si longueur du message > 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void CBiaxialeDlg::OnTimer(UINT_PTR nIDEvent)
    {
    	// TODO: ajoutez ici le code de votre gestionnaire de messages et/ou les paramètres par défaut des appels
    	String^ buffer=Communic::Read();					// lecture port USB
    	pin_ptr<const wchar_t> wch = PtrToStringChars(buffer);	// Pointeur en chaine de caractères
     
    	if(wch[0] != L'')
    	{
    	// traitement
    	}
    }
    ça fonctionne mais cela ne me parait pas optimum.
    Je pense qu'on doit pouvoir faire mieux.


    Merci,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Les interruptions matérielles/logicielles, c'est plutôt réservé aux couches très bas niveau de l'OS.
    Au niveau .NET, on parle plus d'évènements, je pense.
    Et c'est tellement répandu, que je pense qu'ils doivent être gérés/utilisables par la classe de communication que tu utilises déjà (et qu'on connait même pas, vu que tu ne l'indiques pas).

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Les interruptions matérielles/logicielles, c'est plutôt réservé aux couches très bas niveau de l'OS.
    Au niveau .NET, on parle plus d'évènements, je pense.
    Et c'est tellement répandu, que je pense qu'ils doivent être gérés/utilisables par la classe de communication que tu utilises déjà (et qu'on connait même pas, vu que tu ne l'indiques pas).

  4. #4
    Membre à l'essai
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Février 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur mécanique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    La classe Communic est une classe perso: (qui n'a rien d'exceptionnelle)
    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
     
    public ref class Communic
    {
    	private:
     
    		static SerialPort^ serialPort;
     
    	public:
    		static void Ouvrir(wchar_t* NomPort)
    			{
    				int i=0;
    			serialPort = gcnew System::IO::Ports::SerialPort(); 
    			String ^ StringNomPort = gcnew String(NomPort);
    			serialPort->PortName=StringNomPort;
    			if (serialPort->IsOpen == false)
    				serialPort->Open();
     
    			}
     
    		static void Write(String ^octo)
    			{
    			serialPort->Write(octo);
    			Sleep(200);
    			}
     
    		static String^ Read()
    			{
    			String^ buffer=serialPort->ReadExisting();
    			Sleep(200);
    			return(buffer);
    			}
     
    		static void Fermer()
    			{
    			serialPort->Close();
    			}
    }
    ;
    Le Sleep est là pour patienter le temps de la lecture.
    Si je ne le met pas, j'ai des problème de dialogue avec mon périphérique USB
    Le serialPort->IsOpen == false est une mauvaise utilisation.
    Il est là pour vérifier que le port n'est pas déjà ouvert.
    Mais en réalité, il contrôle que sa propre application n'a pas déjà ouvert ce port.
    Si le port est ouvert par une autre application, ça plante.
    ça non plus je ne sais pas le résoudre


    Pour autant, je ne sais pas résoudre mon dilemme
    Je veux bien passer par un événement mais comment le créer???? mystère!

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par fsr86
    Le serialPort->IsOpen == false est une mauvaise utilisation.
    Il est là pour vérifier que le port n'est pas déjà ouvert.
    Mais en réalité, il contrôle que sa propre application n'a pas déjà ouvert ce port.
    Sauf qu'il ne fait même pas ça, vu que tu ré-instancies à chaque fois serialPort dans la méthode Ouvrir()!
    Tu devrais l'instancier dans le constructeur.

    Citation Envoyé par fsr86
    Si le port est ouvert par une autre application, ça plante.
    ça non plus je ne sais pas le résoudre
    Il suffit d'une gestion correcte des exceptions. Dans le cas présent, il vaut mieux laisser l'exception remonter à l'appelant (ou si tu l'attrapes, en relancer une avec un message plus pertinent, incluant l'ancienne dans innerException)

    PS: Pour ce qui est des attentes, vu que tu es dans une application fenêtrée, tu peux utiliser les événements que la classe SerialPort expose: SerialPort Events
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre à l'essai
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Février 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur mécanique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    ça se voit tant que ça que je débute....
    Oh zut!
    Bah ce qu tu me dis doit être vrai... mais je ne sais pas m'en sortir!
    je fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try{serialPort->Open();}
    catch( System::Exception ^e)
    {
    	serialPort->PortName=L"COM1";
    }
    Mais ça ne fonctionne pas complétement.
    En explorant la variable e, je trouve bien dans la variable Message le texte {"L'accès au port 'COM7' est refusé."}
    Et là, je ne sais plus m'en sortir.

    Tant pis, ce sera pour le retour de vacances
    Merci quand même de ton aide.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pourquoi tentes-tu de catcher l'exception dans le code de Ouvrir? Je t'ai dit qu'il convenait de la laisser remonter à l'appelant!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre à l'essai
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Février 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur mécanique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Parceque quand je fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try{Communic::Ouvrir(NomPort);}
    catch( System::Exception ^e)
    {
    	// code plante avant d'arriver ici
    }

    Il plante dans le code précédemment donné.

    Bon mai là je pars en vacances...
    La suite fin aout, Si tu veux bien, bien sur
    Bonnes vacances

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Définis "Il plante".

    Je parie que la réponse est "le debugger dit 'Exception was thrown'" parce que fsr86 ne sait pas exécuter le programme hors du debugger... Et on sait à qui revient la faute pour ça.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [Débutant] Visual studio 2010 - Gestion d'executables externes
    Par nomadev dans le forum Visual Studio
    Réponses: 2
    Dernier message: 19/09/2013, 11h59
  2. [Débutant] gestion stock visual basic 2010
    Par ach2003 dans le forum VB.NET
    Réponses: 4
    Dernier message: 19/08/2012, 22h56
  3. Réponses: 0
    Dernier message: 23/08/2011, 15h12
  4. Gestion des interruptions du microprocesseur sous XP
    Par herve13 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 20/08/2005, 18h29
  5. Réponses: 7
    Dernier message: 02/03/2005, 14h45

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