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

Arduino Discussion :

Requête utilisant Substring


Sujet :

Arduino

  1. #1
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut Requête utilisant Substring
    Bonjour à tous,

    J'ai un problème au niveau de l'affichage dans la console pour une requête utilisant un substring.

    J'utilise Tinkercad pour simuler l’environnement Arduino et tout fonctionne parfaitement dans celui-ci.

    Par contre lorsque le sketch est joué dans l'Arduino cela ne fonctionne pas.

    L'idée est de structurer la réception d'un SMS et effectuer un traitement adapté en fonction du contenu de celui-ci.

    Par exemple la réception de "W_on 10" permet d'arroser pendant 10 minutes (sinon par défaut 7 minutes)
    la réception du SMS se traite comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void receive_message()
    {
      if (SIM900.available() > 0)
      {
        incomingData = SIM900.readString(); // Get the data from the serial port.
        Serial.println(incomingData); 
        Serial.println(stringToLong(incomingData.substring(4)));
        //Serial.println(incomingData.substring(9,8));
        //Serial.println(incomingData.substring(11,10));
        delay(10); 
      }
    }
    Ce qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.println(incomingData);
    affiche bien W_on 10,
    Ce qui ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.println(stringToLong(incomingData.substring(4)));
    devrait m'afficher "10" mais en réalité il n'y a rien.

    Un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.println(incomingData.substring(4));
    ne m'affiche rien non plus.

    Je ne vois pas ce qui cause le problème.

    En vous remerciant pour l'aide.

    Code complet:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    #include <SoftwareSerial.h> // Library for using serial communication
    SoftwareSerial SIM900(3, 4); // Pins 3, 4 are used as used as software serial pins
    //#define SIM900 Serial 
     
    String incomingData;   // for storing incoming serial data
    String message = "";   // A String for storing the message
     
    int relay_pin = 2 ;    // Initialized a pin for relay module
    int relay_pin2 = 5;    // Initialized a pin for relay module
    String rtl;            // to start from pump 1 or pump 2 
    String noMessage;      // if sending confirmation SMS
    String noMessage2;     // if sending confirmation SMS
    unsigned long previousMillis = 0;
    long duration; // for storing pump working duration
     
    void setup()
    {
      delay(10000); //Wait for SIM800 initialisation
      Serial.begin(115200); // baudrate for serial monitor
      SIM900.begin(19200); // baudrate for GSM shield
     
      pinMode(relay_pin, OUTPUT);   // Setting relay pin as output pin
      digitalWrite(relay_pin, HIGH);  // Making relay pin initailly low
      pinMode(relay_pin2, OUTPUT);   // Setting relay pin as output pin
      digitalWrite(relay_pin2, HIGH);  // Making relay pin initailly low
     
      // set SMS mode to text mode
      SIM900.println("AT+CMGF=1\r");  
      delay(100);
     
      // set gsm module to tp show the output on serial out
      SIM900.println("AT+CNMI=2,2,0,0,0\r"); 
      delay(100);
     
     
    }
     
    void loop()
    {
      //Function for receiving sms
      receive_message();
     
      rtl = incomingData.substring(9,8); //Check if "R" in SMS
     
      // if received command is to turn on relay
      if(incomingData.indexOf("W_on")>-1)
      {
     
          //if reverse command received  
          if(rtl == "R"){
           relay_pin = 5;
           relay_pin2 = 2; 
          }
       digitalWrite(relay_pin, LOW); //relay ON
     
        //Duration setup according SMS
        if(stringToLong(incomingData.substring(5))!= 0){
        duration = stringToLong(incomingData.substring(5));
        }
        else {
         duration = 7; 
        } 
     
     
        message = "Arrosage ON " + String(duration) + " minutes" ;
        // Send a sms back to confirm that the relay is turned on
        noMessage = incomingData.substring(11,10); //find "N" in SMS to send message or not
        noMessage2 = incomingData.substring(9,8); 
        if(noMessage != "N" && noMessage2 != "N" ){ 
        //  send_message(message);
        }
      previousMillis = millis();//reset counter
        incomingData = "";//empty message reception
     
      }
     
      // if received command is to turn off relay
      if(incomingData.indexOf("W_off")>-1)
      {
        digitalWrite(relay_pin, HIGH);
        digitalWrite(relay_pin2, HIGH);
        message = "Arrosage OFF";
        // Send a sms back to confirm that the relay is turned off
        send_message(message);
      incomingData = "";
      }        
     if ((digitalRead(relay_pin) == LOW) && (millis() - previousMillis >= (duration * 60000))){
       digitalWrite(relay_pin, HIGH);
       delay(500);
        digitalWrite(relay_pin2, LOW);
           previousMillis = millis();
        }
     
     
     
      if ((digitalRead(relay_pin2) == LOW) && (millis() - previousMillis >= (duration * 60000))){
       digitalWrite(relay_pin2, HIGH);
     
        message = "Arrosage OFF";
        // Send a sms back to confirm that the relay is turned off
         if(noMessage != "N" && noMessage2 != "N" ){ 
        send_message(message);
        }
     
      }
     
     
    }
    long stringToLong(String s)
    {
       char arr[12];
       s.toCharArray(arr, sizeof(arr));
       return atol(arr);
    }
     
     
     
    void receive_message()
    {
      if (SIM900.available() > 0)
      {
        incomingData = SIM900.readString(); // Get the data from the serial port.
        Serial.println(incomingData); 
        Serial.println(incomingData.substring(5));
        //Serial.println(stringToLong(incomingData.substring(4)));
        //Serial.println(incomingData.substring(9,8));
        //Serial.println(incomingData.substring(11,10));
        delay(10); 
      }
    }
     
    void send_message(String message)
    {
      SIM900.println("AT+CMGF=1");    //Set the GSM Module in Text Mode
      delay(100);  
      SIM900.println("AT+CMGS=\"+123456\""); 
      delay(100);
      SIM900.println(message);   // The SMS text you want to send
      delay(100);
      SIM900.println((char)26);  // ASCII code of CTRL+Z
      delay(100);
      SIM900.println();
      delay(1000);  
    }

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bonjour,

    ça ne serait pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stringToLong(incomingData.substring(6))
    ?

  3. #3
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut
    En fait j'ai mis des guillemets dans mon descriptif pour mettre en évidence le contenu du SMS mais en réalité il n'y en a pas.

    Donc le message exact est : W_on 10

    un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stringToLong(incomingData.substring(4))
    devrait en principe se compter comme ceci:
    W _ o n 1 0
    0 1 2 3 4 5 6

    Avec l'argument unique de 4 dans substring, il doit prendre tout ce qui vient après la 4ème position. Ou bien je me trompe ?

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 120
    Billets dans le blog
    47
    Par défaut
    Salut,

    D'après la doc, l'indice de départ commence à 5 dans ton cas !

    The starting index is inclusive (the corresponding character is included in the substring)

  5. #5
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut
    C'est très curieux car cela n'affiche rien à part un 0 pour ma requête substring : Serial.println(stringToLong(incomingData.substring(5)));

    Voici le résultat de la console:
    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
    AT+CMGF=1
    OK
    AT+CNMI=2,2,0,0,0
    OK
    0 //affiche 0 à l'initialisation de la ligne Serial.println(stringToLong(incomingData.substring(5)));
    
    +CMT: "+32123456","","20/07/13,20:55:23+08"
    W_on 10 //réceptionne et affiche correctement le contenu du SMS
    0   //que je fasse un substring(4) ou (5) ou (6) il me sort un zéro
    
    AT+CMGF=1
    
    
    OK
    AT+CNMI=2,2,0,0,0
    
    
    OK
    0
    Si vous voyez pourquoi il ne veut pas afficher mon chiffre 10 car je tourne en rond.

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Je n'avais pas vu que ta fonction stringToLong() était de toi. Il existe la fonction toInt() de l'objet String.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int a;
    String incomingData = "W_on 10";
     
    a = incomingData.substring(5).toInt();
    Serial.println(a);

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 120
    Billets dans le blog
    47
    Par défaut
    Il y a beaucoup de chaines de caractères manipulées dans le programme. Quand un programme compile et que les résultats sont incohérents, on peut se demander s'il ne consomme pas trop de mémoire SRAM (limitée à 2ko sur Arduino UNO).

    Essayer avec une version minimale du programme pour voir si c'est bien ça.
    Tu peux aussi essayer avec des chaînes plus courtes, stocker les messages dans la mémoire Flash avec la macro F() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.println(F("cette chaine de caractères est sauvegardée en memoire Flash et non en mémoire SRAM"));

  8. #8
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut
    J'ai refactoré mon code afin de le simplifier un max mais je n'ai obtenu aucune amélioration.

    C'est à s'arracher les cheveux et j'en ai de moins en moins

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
     
     
    #include <SoftwareSerial.h> // Library for using serial communication
    SoftwareSerial SIM900(3, 4); // Pins 3, 4 are used as used as software serial pins
    #define relay_pin 2 
    #define relay_pin2 5
     
    String incomingData;   // for storing incoming serial data
    String message = "";   // A String for storing the message
    int minutes;
     
     
    unsigned long previousMillis = 0;
    long duration; // for storing pump working duration
     
    void setup()
    {
      //delay(15000); 
      Serial.begin(115200); // baudrate for serial monitor
      SIM900.begin(9600); // baudrate for GSM shield
     
      pinMode(relay_pin, OUTPUT);   // Setting erlay pin as output pin
      digitalWrite(relay_pin, HIGH);  // Making relay pin initailly low
     pinMode(relay_pin2, OUTPUT);   // Setting erlay pin as output pin
      digitalWrite(relay_pin2, HIGH);  // Making relay pin initailly low
     
      // set SMS mode to text mode
      SIM900.println("AT+CMGF=1\r");  
      delay(100);
     
      // set gsm module to tp show the output on serial out
      SIM900.println("AT+CNMI=2,2,0,0,0\r"); 
      delay(100);
     
     
    }
     
    void loop()
    {
     
     
      //Function for receiving sms
      receive_message();
     
     
     
      // if received command is to turn on relay
      if(incomingData.indexOf("W_on")>-1)
      {   
     
        digitalWrite(relay_pin, LOW);
        if(minutes >0)
        { duration = minutes; }
        else {
         duration = 7; 
        }
     
     
        message = "Arrosage ON " + String(duration) + " minutes" ;
        // Send a sms back to confirm that the relay is turned on
     
        Serial.println(message);
     
        previousMillis = millis();//reset counter
        incomingData = "";//empty message reception
     
      }
     
      // if received command is to turn off relay
      if(incomingData.indexOf("W_off")>-1)
      {
        digitalWrite(relay_pin, HIGH);
        digitalWrite(relay_pin2, HIGH);
        message = "Arrosage OFF";
        // Send a sms back to confirm that the relay is turned off
        send_message(message);
      incomingData = "";
      }        
     if ((digitalRead(relay_pin) == LOW) && (millis() - previousMillis >= (duration * 60000))){
       digitalWrite(relay_pin, HIGH);
       delay(500);
        digitalWrite(relay_pin2, LOW);
           previousMillis = millis();
        }
     
     
     
      if ((digitalRead(relay_pin2) == LOW) && (millis() - previousMillis >= (duration * 60000))){
       digitalWrite(relay_pin2, HIGH);
     
        message = "Arrosage OFF";
        // Send a sms back to confirm that the relay is turned off
        send_message(message);
     
     
      }
     
     
    }
     
     
     
     
    void receive_message()
    {
      if (SIM900.available() > 0)
      {
        incomingData = SIM900.readString(); // Get the data from the serial port.
        Serial.println(incomingData); 
        minutes = incomingData.substring(5).toInt();
     
        Serial.println(minutes);
     
        delay(10); 
      }
    }
     
    void send_message(String message)
    {
      SIM900.println("AT+CMGF=1");    //Set the GSM Module in Text Mode
      delay(100);  
      SIM900.println("AT+CMGS=\"+3212345\""); 
      delay(100);
      SIM900.println(message);   // The SMS text you want to send
      delay(100);
      SIM900.println((char)26);  // ASCII code of CTRL+Z
      delay(100);
      SIM900.println();
      delay(1000);  
    }
    La console :
    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
    AT+CMGF=1
    
    
    OK
    AT+CNMI=2,2,0,0,0
    
    
    OK
    
    0
    
    +CMT: "+3212345","","20/07/14,20:19:56+08"
    W_on 10
    
    0  //toujours un zéro quelque soit le substring(4) ou 5, ...
    Arrosage ON 7 minutes

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    Je pense qu'il est possible que ce que vous recevez dans incomingData, ce sont deux lignes de texte.

    +CMT: "+3212345","","20/07/14,20:19:56+08"
    W_on 10


    ==> que vous alliez lire en 4, en 5 ou en 6 c'est pas un nombre donc atol ou toInt() vont dire 0.

    Pour vérifiez ce qu'il en est vraiment changez votre fonction receive_message() en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void receive_message()
    {
      if (SIM900.available() > 0)
      {
        incomingData = SIM900.readString(); // Get the data from the serial port.
        Serial.print(F("DEBUT RECEPTION: <<"));
        Serial.print(incomingData);
        Serial.println(F(">> FIN RECEPTION"));
        minutes = incomingData.substring(5).toInt();
        Serial.println(minutes);
        delay(10);
      }
    }
    comme cela on sera fixé...


    sinon au delà de ça, gérer le port série avec readString et espérer avoir un comportement stable est un peu illusoire dans la durée, surtout en passant des String en paramètre (duplication mémoire)). faudrait rendre cela plus robuste (attendre une réponse aux commandes en tenant compte de ce que vous devriez recevoir, par exemple un 'OK' etc)

  10. #10
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour legrandse
    Citation Envoyé par legrandse Voir le message
    C'est à s'arracher les cheveux et j'en ai de moins en moins [CODE]
    On est beaucoup a en être au même point!, de ce côté là. J'espère sauver une partie de ta toison avec ma petite explication

    Comme je n'ai pas de carte SIM900, j'ai fait une simulation où tout passe par le Serial et tout fonctionne parfaitement, ce qui me fait penser que ton problème provient de ce qui arrive depuis le serial de la SIM900.
    Tu est, peut être, victime de caractère "fantômes" sis au début et à la fin (mais surtout au début) de la chaîne W_on 10 par exemple \n\rW_on 10\n\r (ASCII 10 et 13). Donc si ces caractères sont placés au début de la chaîne , ça décale tout de 2 positions. Ce problème survient avec l'usage de
    SIM900.readString();
    avec ça, on "ramasse" tout, il serait préférable de lire caractère après caractère, en triant ou écrire une fonction qui nettoie la chaîne reçue.

    J'ai modifi ta fonction void receive_message() pour mettre le problème en évidence
    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
     void receive_message()
     {
    	 if (SIM900.available() > 0)
    	 {
    		 incomingData = SIM900.readString(); // Get the data from the serial port.
    		 Serial.println(incomingData);
    		 minutes = incomingData.substring(5).toInt();
     
    		 Serial.println(minutes);
     
    		 Serial.println("\nNb caracteres " + String(incomingData.length()));
    		 Serial.println("Codes ASCII");
    		 for (int i = 0; i< incomingData.length(); i++)
    		 {
    			 Serial.println((int)incomingData.charAt(i));
    		 }
     
    		 delay(10);
    	 }
     }
    Tu verras à la longueur de la chaîne (W_on 10), normalement 7 et à la liste des codes ASCII des caractères, tout ce qui est en-dessous de 32 (espace) sont des caractères de contrôles donc "fantômes" dans notre cas.

    A+
    Cordialement
    jpbbricole

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Bonjour legrandse
    Tu est, peut être, victime de caractère "fantômes" sis au début et à la fin (mais surtout au début) de la chaîne W_on 10 par exemple \n\rW_on 10\n\r (ASCII 10 et 13). Donc si ces caractères sont placés au début de la chaîne , ça décale tout de 2 positions. Ce problème survient avec l'usage de
    SIM900.readString();
    avec ça, on "ramasse" tout, il serait préférable de lire caractère après caractère, en triant ou écrire une fonction qui nettoie la chaîne reçue.
    Oui c'est ce que j'ai suggéré ci dessous mais à mon avis plus que juste "fantômes" (comme le buffer d'entrée n'est pas vidé après le passage d'une commande AT, il y a aussi la réponse AT et lors de la réception d'un SMS il y a un prologue avant de voir le contenu du SMS).

    On le voit par exemple dans la sortie console série
    AT+CMGF=1


    OK
    AT+CNMI=2,2,0,0,0


    OK

    0
    tout ce qui est en rouge c'est dans le buffer à mon avis et le 0 qui suit c'est l'extraction de la valeur (qui ne donne rien puisqu'il n'y avait pas d'entier à cet endroit).


    @legrandse:

    vous ne voyez pas le soucis dans les autres commandes car vous faites une recherche n'importe où dans la chaine avec par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if(incomingData.indexOf("W_on")>-1)
    donc là ça fonctionne même s'il y a des caractères en plus.

    Pour résoudre ce problème - si c'est le cas et sans pour autant tout re-écrire pour le moment, vous pourriez chercher si le message contient "W_" et extraire les informations situées après cette chaîne. comme cela même s'il y a du bazar dans la chaîne juste avant et après ce n'est pas grave.

  12. #12
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut
    Bonsoir,

    Je vous remercie beaucoup pour vos suggestions et conseils.
    Et c'était bien cela, incomingData = SIM900.readString(); contenait bien du texte avant le contenu de mon SMS.

    Dans mon cas :
    +CMT: "+3212345","","20/07/14,20:19:56+08"
    W_on 10
    le substring se trouvait à la position 54 (avec un n° de gsm correct ) Ce qui induisait en erreur c'était que W_on 10 se trouvait sur une nouvelle ligne faisant croire qu'il n'y avait rien avant.

    Et effectivement, à long terme je doute aussi que cette méthode de récupération et traitement du message soit d'une toute grande fiabilité. Mais bon à mon avis j'en ai quand même pour un certain temps de tranquillité... et de garder un peu mes cheveux aussi

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    Cool, le mystère est résolu et le coiffeur aura encore du boulot

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

Discussions similaires

  1. [Participez]Requête utilisée?
    Par xycoco dans le forum Contribuez
    Réponses: 34
    Dernier message: 30/05/2007, 16h18
  2. Oracle 9i : Requête utilisant un clob et union
    Par zambi dans le forum Oracle
    Réponses: 6
    Dernier message: 10/04/2006, 21h17
  3. utilisation substring
    Par yannickrohel dans le forum C
    Réponses: 8
    Dernier message: 25/02/2006, 22h08
  4. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  5. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18

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