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 :

exception de type : ArgumentOutOfRangeException


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut exception de type : ArgumentOutOfRangeException
    Bonjour,

    voila je reçoit des données au format ASCII par le port série et j’effectue un traitement sur ses données avec la fonction declenchement_dispositif tout fonctionne bien la plupart du temps, mais quelque fois j'obtient une exceptions au déclenchement de la fonction, j'ai écrit celle ci dans un fichier texte et voila l'exception :

    13/06/2015 10:22:42 fonction declenchement_dispositif :: System.ArgumentOutOfRangeException: L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
    Nom du paramètre*: startIndex
    à System.Globalization.CompareInfo.IndexOf(String source, String value, Int32 startIndex, Int32 count, CompareOptions options)
    à System.Globalization.CompareInfo.IndexOf(String source, String value, Int32 startIndex)
    à System.String.IndexOf(String value, Int32 startIndex)
    à start_delta_web.Test_RS232.declenchement_dispositif() dans C:\Users\PNPN\Documents\Visual Studio 2005\Projects\start_delta_web\RS232.vb:ligne 249


    J'ai donc localisé la ligne 249 dans RS232.vb ou ce trouve le code posant problème (il est extrait de ma fonction declenchement_dispositif et extrait des données spécifiques reçu par le port série et placé dans la textbox1 :

    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
     
    246             For Each ligne As String In TextBox1.Text.Split(ControlChars.NewLine) 'pour chaque ligne de la textbox je sépare les caractéres
    247                    'ville 
    248                    Dim debut_ville As Integer = TextBox1.Text.IndexOf("Commune : ") + 10 'entier qui repére le nom commune et ajoute 10 
    249                    Dim fin_ville As Integer = TextBox1.Text.IndexOf(ControlChars.NewLine, debut_ville) 'entier qui repére la fin de la ligne
    250                    Dim longeur_ville As Integer = fin_ville - debut_ville 'soustrait la fin du début de la valeur de commune
    251                    commune_op = TextBox1.Text.Substring(debut_ville, longeur_ville)
    252                    'adresse
    253                    Dim debut_adresse As Integer = TextBox1.Text.IndexOf("Adresse : ") + 10
    254                    Dim fin_adresse As Integer = TextBox1.Text.IndexOf(ControlChars.NewLine, debut_adresse)
    255                   Dim longeur_adresse As Integer = fin_adresse - debut_adresse
    256                    adresse_op = TextBox1.Text.Substring(debut_adresse, longeur_adresse)
    257                    'commande
    258                    Dim debut_commande As Integer = TextBox1.Text.IndexOf("Commande : ") + 11
    259                    Dim fin_commande As Integer = TextBox1.Text.IndexOf(ControlChars.NewLine, debut_commande)
    260                    Dim longeur_commande As Integer = fin_commande - debut_commande
    261                    commande_op = TextBox1.Text.Substring(debut_commande, longeur_commande)
    262              Next
    En fait cette partie de code me permet de récupérer le texte qui se situe après chaque libellé et avant la fin de ligne (commune, adresse, commande) et ainsi les stocker dans des variables appropriés.

    Mais je ne comprend pas l'exception levé 'L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.' car je ne possède pas de collection a ligne 249 !!!
    Auriez vous une idée du problème rencontré ?

    d'avance je vous remercie

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ce n'est pas parce que tu es censé recevoir ABCD que tu vas recevoir ABCD
    tu peux recevoir AB puis CD dans le prochain évènement (c'est le principe d'émission/réception des ports série et des sockets aussi)
    donc ton indexof peut ne pas trouver ce que tu cherches et il me semble que dans ce cas il retourne -1

    c'est à toi de faire le traitement que si tu as recu la totalité de ce que tu devais recevoir
    c'est d'ailleurs pour ca que dans les protocoles de communication il y a souvent des caractères de fin de trame (genre CrLf) ou autre technique permettant de vérifier l'entièreté et/ou l'intégrité (checksum)
    intégrité parce qu'en plus sur un port série il peut arriver que quand l'émetteur envoie ABCD le récepteur recoive AZCD (s'il y a des interférences à ce moment)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    merci pol63 pour cette réponse aussi précise que rapide,

    je comprend très bien ce que tu veux dire, mais je suis confronté à un problème car je ne reçoit jamais des trames de mêmes longueur, mais ce qui y est sur c'est que je recevrais toujours les chaines (Commune : , Adresse : et Commande
    Autre soucis c'est que à la fin de la trame aucun signe particulier permet d'identifier la fin de la réception, ni chaîne de caractère ou même caractère !

    Ainsi afin de résoudre se problème j'ai du mettre en place dans le datareceived de mon serialport un timer qui se déclenche 3700 ms (le temps moyen pour recevoir la totalité de la trame) avec dans ce timer ma fonction declenchement_dispositif qui effectuera le traitement des données issus du port série qui sont placé dans une textbox.

    Ainsi pour le moment je n'ai que comme solution d'augmenter ce timer dans le but de plus avoir cette exception....

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    4 CrLf ca n'irait pas ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. erreur :An unhandled exception of type
    Par Blunt dans le forum Visual C++
    Réponses: 3
    Dernier message: 21/04/2007, 19h55
  2. Réponses: 3
    Dernier message: 30/03/2007, 11h57
  3. Réponses: 1
    Dernier message: 27/03/2007, 09h50
  4. probleme avec l'exception de type NullPointerException
    Par darkdindon dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2007, 05h27
  5. Réponses: 2
    Dernier message: 11/10/2006, 10h36

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