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

VB.NET Discussion :

[VB.Net 2.0/SerialPort] Pourquoi ai-je une Exception à la fermeture ?


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 12
    Points : 12
    Points
    12
    Par défaut [VB.Net 2.0/SerialPort] Pourquoi ai-je une Exception à la fermeture ?
    Je transforme une appli VB 2003 vers VB 2005.
    En 2003 j'utilisait MSCOM pour recevoir des lignes de texte sur Com1.
    En 2005 j'utilise le nouveau composant SerialPort.

    J'ai réglé le problème de Tread-Safe avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Control.CheckForIllegalCrossThreadCalls = False
    ou en utilisant InvokeRequired avec un Delegate.

    Le probleme est à la fermeture du SerialPort ou à la fermeture directe du Form, j'ai le message
    "L'opération d'entrée/sortie a été abandonnée en raison de l'arrêt d'une thread ou à la demande d'une application."
    et l'appli se bloque.

    L'erreur se produit dans la procédure SerialPort1_DataReceveid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_String=me.serialPort1.ReadLine
    J'ai essayé plusieurs méthodes, dont une après avoir fermé SerialPort, l'application était bloquée et la réception des lignes continuait à s'enregistrer.

    La définition de SerialPort.Close : Ferme la connexion au port, affecte à la propriété IsOpen la valeur false et supprime l'objet Stream interne.

    Je pense que le Stream est supprimé avant la fermeture éffective du Port.

    Merci de me renseigné sur ce problème.

  2. #2
    Invité
    Invité(e)
    Par défaut
    L'erreur se produit dans la procédure SerialPort1_DataReceveid
    Je pense que tu ferme le stream alors que tu a encore des caracteres dans le buffer d'entrée

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Je pense avoir trouvé la solution, au moins pour mon utilisation de SerialPort.

    La commande qui m'interessait était "SerialPortReadLine" puisqu'il s'agit de surveiller les appels vers des Bips recherche de personnes,1 ligne=1appel.

    J'utilise maintenant "SerialPort.ReadExisting" et je détecte VbCrLf.
    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
     
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As
     System.IO.Ports.SerialDataReceivedEventArgs) Handles
     SerialPort1.DataReceived
            Try
                Str += Me.SerialPort1.ReadExisting
                If Microsoft.VisualBasic.Right(Str, 2) = vbCrLf Then
                    'démarrage aléatoire, une ligne complète doit démarrer avec
     un format Heure
                    If Not Trim(Str) Like "##:##??????##?#*" Then
                        Str = ""
                        Exit Sub
                    Else
                        ' Suppression de vbCrLf
                        Str = Microsoft.VisualBasic.Left(Str, Len(Str) - 2) 
                        Me.RichTextBox1.AppendText(Str)
                        Me.RichTextBox1.Focus()
                        Me.RichTextBox1.ScrollToCaret()
                        ' enregistrement dans la base de donnée
                        TraitementLigneReception(Str) 
                        Str = ""
                    End If
               End If
          Catch ex As Exception
               MsgBox(ex.Message)
               Return
          End Try
     End Sub
    Le problème reste entier pour ReadLine.
    Je pense que le ReadLine ne s'éffectue pas au niveau du port lui-même, mais utilise le ReadExisting et charge le StreamIO jusqu'a VbCrLf et envoi ensuite le segment à l'utilisation.
    A la fermeture du Port comme le streamIO est supprimé, la Thread du port doit l'être également, tout depend dans quel ordre,si c'est avant la fermeture du port, DataReceived doit avoir des problèmes de fonctionnement?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/07/2007, 15h05
  2. [VB.Net]Obtenir le N° de ligne d'une Exception
    Par MaelstroeM dans le forum VB.NET
    Réponses: 5
    Dernier message: 22/11/2006, 20h15
  3. [ASP.Net 2.0/Oracle] Pourquoi ai-je une erreur de connection ?
    Par lenoil dans le forum Accès aux données
    Réponses: 1
    Dernier message: 02/08/2006, 08h28
  4. [ADO.Net][C#] Pourquoi OracleConnection lève une exception ?
    Par meuledor dans le forum Accès aux données
    Réponses: 2
    Dernier message: 26/01/2006, 17h54
  5. Réponses: 9
    Dernier message: 31/05/2005, 10h05

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