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

C# Discussion :

Fermeture d'application avec un port serie plus présent


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut Fermeture d'application avec un port serie plus présent
    Bonjour

    J'ai dans mon appli C# un port série via un convertisseur USB/RS232.
    Quand le convertisseur est branché, j'ouvre le port et le ferme le port sans problème et je peux quitter mon application sans problème.

    Dans le cas d'une gestion d'alarme je dois détecter si le port serie est débranché. Je suis donc arrivé a détecter le debranchement de mon convertisseur sans problème, quand cet événement arrive je ferme mon port par les même fonctions que précédemment bien que le port ne soit plus là mais je n'ai aucune erreur, je présume donc que ceci se passe bien.

    Mon souci, le port série n'étant plus présent, quand je ferme mon appli j'ai une exception qui arrive a la dernière accolade
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
           [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);                     
                Application.Run(new Form1());
     
                int a = 0;
     
            }
    Nota : le int a = 0 etait just pour mettre un point d'arrêt avant l'accolade

    Cet exception est UnauthorizedAccessException,
    avec comme info :
    {"L'accès au port est refusé."}
    StackTrace : à System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
    à System.IO.Ports.InternalResources.WinIOError()
    à System.IO.Ports.SerialStream.Dispose(Boolean disposing)
    à System.IO.Ports.SerialStream.Finalize()
    et bien sur aucune source est disponible donc je ne vois pas ce que je fait de mauvais sachant que pour moi tout mes objets sont normalement tués, et je ne voit pas qui essaie d'accéder au port qui a été déconnecté.

    Si vous avez une piste

    Cordialement

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Est-ce que tu peux montrer comment tu fermes ton port au moment de la détection que l'alarme n'est plus branché ? Est-ce que vous utilisez un protocole pour communiquer une déconnexion ou est-ce déterminé par une erreur de tentative d'écriture ou de lecture sur le port ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Bonjour et merci de ta réponse!


    Pour détecter l'alarme, je détecte les évènements sur le port USB et crée un event. Je lis après dans la base de registre pour savoir si mon port serie a disparu, si il n'est plus là j'ai bien une déconnexion de mon USB et lance un autre event.

    Le code de deconnexion est le suivant

    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
     
     watcher.Dispose();
                    watcher = null;
                    if (eventThread != null) eventThread.stopThread();
                    deviceBoard.deviceChannel.cancelPendingOperations();
                    Thread.Sleep(200);
                    eventThread = null;
                    if (deviceBoard.IsConnected) deviceBoard.DisconnectBoard();
                    deviceBoard = null;
                    isConnected = false;
                    isInScan = false;
                    readerData.DeviceID = null;
                    driveLight = false;
                    readerData.RspScan = RespScan.RS_FailedToConnect;
                   // MessageBox.Show("Launch the notification power cut due to usb unplugged", "Info");
                    notifyEvent = new rfidReaderArgs(SerialNumber, rfidReaderArgs.ReaderNotify.RN_PowerCut_CableUnplug, "Usb Removed");
                    if (NotifyEvent != null) NotifyEvent(this, notifyEvent);
    Le watcher surveille les déconnexions de l'usb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eventThread.stopThread();
    -> passe un boolean a faut pour terminer le thread, le thread étant bloqué par un WaitOne();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    deviceBoard.deviceChannel.cancelPendingOperations();
    -> set les AutoResetEvent de mes threads pour passer les waitone(), les boolean étant testé après pour sortir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (deviceBoard.IsConnected) deviceBoard.DisconnectBoard();
    -> la function de deconnexion a part entiere

    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
    public bool DisconnectBoard()
            {
                if (deviceChannel.CloseSerialPort())
                {
                    bConnected = false;
                    deviceChannel = null;
                }
                return (bConnected);
            }
     //autre class
    public bool CloseSerialPort()
            {
                try
                {              
                    serialPort.Close();
                    serialPort = null;
                    bHelloWorldProcess = true;
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    cordialement

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Bonjour

    Apres de multiple recherche, il s'agit d'un problème existant depuis le framework 1.1 qui n'a jamais été résolu dans le .net mais par une pirouette dans le fichier de configuration.
    Malheureusement la pirouette ne marche pas pour moi.


    La solution est de ne pas laissé le garbage collector détruire le baseStream de l'objet serial port si le port est débranche.

    Une solution est d'ajouté après avoir ouvert le port

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     serialPort = null;
                    serialPort = new SerialPort(PortCom, 115200, Parity.None, 8, StopBits.One);
                    serialPort.Open();
     
                    GC.SuppressFinalize(serialPort.BaseStream);
    et pour sa fermeture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     serialPort.DataReceived -= new SerialDataReceivedEventHandler(OnDataReceived);
                    serialPort.ErrorReceived -= new SerialErrorReceivedEventHandler(OnErrorReceived);
                    serialPort.PinChanged -= new SerialPinChangedEventHandler(OnSerialPinChanged);
                    serialPort.Close();
     
                    GC.ReRegisterForFinalize(serialPort.BaseStream);
    cordialement

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2006, 10h26
  2. Besoin de communiquer avec un port serie RS232 ?
    Par MonsieurAk dans le forum Linux
    Réponses: 2
    Dernier message: 01/02/2006, 18h13
  3. bizarreries avec le port serie
    Par Invité dans le forum MFC
    Réponses: 3
    Dernier message: 20/10/2005, 18h35
  4. galere avec le port serie...
    Par toto4650 dans le forum MFC
    Réponses: 6
    Dernier message: 09/09/2005, 17h33
  5. Perdu avec la communication avec le port serie
    Par gilles641 dans le forum Langage
    Réponses: 8
    Dernier message: 23/08/2005, 21h11

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