GSM GSMPin.begin return

Bonjour.
j'essaie de vérifier l'état de ma carte SIM avec la commande
GSMPin.begin(), mais je ne peux pas récupérer de valeur. J'obtiens une erreur de compilation qui me dit que la fonction ne retourne rien (void). J'utilise la librairie GSM 1.0.6.
Y a-t-il une explication ?
Merci d'avance.
Sébastien

je pense que vous utilisez ceci comme référence mais bon de confirmer - vous pouvez y voir que l'appel à begin retourne 1 si le modem est OK, sinon une erreurr

J'utilise la librairie GSM 1.0.6.

---> la libraire GSM fait partie en standard de l'IDE. avez vous téléchargé une autre librairie?

bien sûr il faut utiliser une version récente et moderne de l'IDE

Oui, c'est bien cela mon problème...
Voici le message d'erreur :

Arduino : 1.8.2 (Windows XP), Carte : "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

In file included from C:\Program Files\Arduino\libraries\GSM\src/GSM.h:46:0,

                 from C:\Arduino\GSM_Control\GSM_Control.ino:19:

C:\Program Files\Arduino\libraries\GSM\src/GSM3ShieldV1BandManagement.h:49:125: warning: 'typedef' was ignored in this declaration

 typedef enum GSM3GSMBand {UNDEFINED, EGSM_MODE, DCS_MODE, PCS_MODE, EGSM_DCS_MODE, GSM850_PCS_MODE, GSM850_EGSM_DCS_PCS_MODE};

                                                                                                                             ^

C:\Arduino\GSM_Control\GSM_Control.ino: In function 'void setup()':

GSM_Control:204: error: void value not ignored as it ought to be

   int pin_inserted=PINManager.begin();

                                     ^

exit status 1
void value not ignored as it ought to be

Bibliothèque non valide trouvée dans C:\Documents and Settings\sc\Mes documents\Arduino\libraries\examples : C:\Documents and Settings\sc\Mes documents\Arduino\libraries\examples
Bibliothèque non valide trouvée dans C:\Documents and Settings\sc\Mes documents\Arduino\libraries\libraries : C:\Documents and Settings\sc\Mes documents\Arduino\libraries\libraries

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.
#include <GSM.h>        // import the GSM library

#include <HEXA_NUM.h>
#include <RS485.h>
#include <CALCTIME.h>
#include <EEPROM.h>

GSMPIN PINManager;
.....
  int pin_inserted=PINManager.begin();

J'ai chargé la dernière version de l'ide
1.8.2

hum - quand on rencontre ce genre de soucis, le meilleur moyen de debugger c'est d'aller voir le code source - c'est "the ultimate documentation" comme disent les anglophones :slight_smile:

dans le fichier [url=https://github.com/codebendercc/arduino-library-files/blob/0b4140bf19ccee5bc8745004b17c3506e64e3ed7/libraries/GSM/GSM.h]arduino-library-files/libraries/GSM/GSM.h[/url] vous avez#define GSMPIN GSM3ShieldV1PinManagement

Si je vais voir le code source de [url=https://github.com/codebendercc/arduino-library-files/blob/0b4140bf19ccee5bc8745004b17c3506e64e3ed7/libraries/GSM/GSM3ShieldV1PinManagement.cpp]arduino-library-files/libraries/GSM/GSM3ShieldV1PinManagement.cpp[/url]

je vois

// reset the modem for direct access
void GSM3ShieldV1PinManagement::begin()
{
	// reset hardware
	gsm.HWrestart();

	pin_used = false;
	
	// check modem response
	modemAccess.writeModemCommand("AT", 1000);
	modemAccess.writeModemCommand("ATE0", 1000);
}

--> donc la doc n'est pas à jour, l'appel à begin retourne bien un void.

si vous regardez dans le fichier [url=https://github.com/codebendercc/arduino-library-files/blob/0b4140bf19ccee5bc8745004b17c3506e64e3ed7/libraries/GSM/GSM3ShieldV1PinManagement.h]arduino-library-files/libraries/GSM/GSM3ShieldV1PinManagement.h[/url] quelles options potentielles sont disponibles pour vérifier l'état:

/** Check modem response and restart it		 */
void begin();
	
/** Check if PIN lock or PUK lock is activated
@return 0 if PIN lock is off, 1 if PIN lock is on, -1 if PUK lock is on, -2 if error exists
*/
int isPIN();
		
/** Check if PIN code is correct and valid
@param pin			PIN code
@return 0 if is correct, -1 if is incorrect
*/
int checkPIN(String pin);

/** Check if PUK code is correct and establish new PIN code
@param puk			PUK code
@param pin			New PIN code
@return 0 if successful, otherwise return -1
*/
int checkPUK(String puk, String pin);

--> utilisez une des fonctions de test pour votre besoin

int isPIN();
int checkPIN(String pin);
int checkPUK(String puk, String pin);

Tout d'abord, un GRAND merci.
C'est en effet ce que je craignais.....

De plus, lorsque je fais un IsPIN, je reçois la valeur -2.
Alors que si je mets la puce dans un portable, j'entre le PIN et tout fonctionne !
Donc je voulais prendre le résultat du begin pour savoir s'il y avait un problème de connexion.
Je séche maintenant avec mon IsPIN à -2.

là encore vous pouvez regarder le code source (une honte de programmer comme cela avec la classe String mais c'est une autre histoire)

int GSM3ShieldV1PinManagement::isPIN()
{
  String res = modemAccess.writeModemCommand("AT+CPIN?",1000);
  // Check response
  char res_to_compare[res.length()];
  res.toCharArray(res_to_compare, res.length());
  if(strstr(res_to_compare, "READY") != NULL)
    return 0;
  else if(strstr(res_to_compare, "SIM PIN") != NULL)
    return 1; 
  else if(strstr(res_to_compare, "SIM PUK") != NULL)
    return -1;
  else
    return -2;
}

ils envoient un AT+CPIN? au module et regardent la réponse

si c'est READY --> renvoie 0
si c'est SIM PIN --> renvoie 1
si c'est SIM PUK --> renvoie -1
sinon si c'est autre chose, ça vous renvoie -2

==> si j'étais vous je connecterais mon shield GSM à la main et j'enverrrai la commande AT+CPIN? au module et j'afficherai la réponse...

Bonjour.
Merci.
Mais je n'arrive pas à récupérer la chaine.

GSM3ShieldV1DirectModemProvider modemAccess(false);

  modemAccess.begin();
  modemAccess.restartModem();
//modemAccess.connect();
  String tmps;
  
  Serial.println("modemAccess.writeModemCommand");
  String res;
  res.reserve(40);
  res = (modemAccess.writeModemCommand("AT+CPIN?",1000));
  Serial.print("modemAccess.writeModemCommand = ");
  Serial.print(res);
  Serial.println("//");

J'ai toujours un chaine vide !

vous avez quoi comme shield GSM et comme arduino?

l'idéal serait de faire la connexion "à la main"

Une ATMEGA 2560 avec ARDUINO GSM SHIELD 2 (INTEGRATED ANTENNA).

Qu'entendez-vous par connexion "à la main".

comme vous avez une MEGA qui a des port séries matériel, je n'utiliserai pas SoftwareSerial

n'enfichez pas la carte au dessus de votre Mega, mettez des fils entre des pins de la MEGA et votre shield pour avoir les fonctions minimum et n'utilisez pas la librairie, utilisez juste la communication Série

la doc dit:

The shield uses digital pins 2 and 3 for software serial communication with the M10. Pin 2 is connected to the M10’s TX pin and pin 3 to its RX pin. The modem's PWRKEY pin is connected to Arduino pin 7.

--> au lieu de prendre les Pins 2 et 3 de votre arduino Mega connectée sur les pin Tx/Rx utilisez le pins du port Serial 1: 19 (RX) and 18 (TX); --> mettez un fil entre arduino D19 et la pin du shield qui vient se brancher sur la pin 2 de l'arduino et un fil entre Arduino D18 et la pin du shield qui vient se brancher sur la pin 3 de l'arduino

comme cela vous aurez Serial 1 Rx <--> M10’s TX et Serial 1 Tx <--> M10’s RX

Connectez les pins 7 entre elles
Connectez les pins GND entre elles

Alimentez votre Mega depuis le port USB
Alimentez le shield GSM depuis une alimentation 5V capable de délivrer 2A

ensuite faire un bout de code qui dans le setup() faire

Serial.begin(115200);
Serial1.begin(9600); // à vérifier si c'est le bon débit
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);

et dans la loop() lit sur Serial (ce que vous tapez dans la console arduino) et qui l'envoie sur Serial1 et inversement

--> ça vous permet d'envoyer directement des commandes AT et de voir les réponses

J'ai essayé mais je ne reçois rien sur la ligne Série Serial1.

Par contre, si j'utilise gsmAccess.begin(aCodePin) de la classe GSM, mon système s'initialise correctement.
et je reçois les sms.
J'aurais voulu faire des tests sur le code PIN car j'ai réussi à bloquer une carte SIM.

J'ai recommencé avec les platines séparées. Je travaille avec le port 3 et la commande AT+PIN?
me retourne
AT+CPIN?
AT+CPIN?

+CPIN: SIM PIN

Alors maintenant pourquoi la classe GSMPIN ne fonctionne pas, je ne trouve pas.

J'ai mis l'oscillo.
Les commandes arrivent bien sur la pin 3.
Par contre pas de réponse. (en pin2)
Problème d'initialisation ou de vitesse ? je ne sais pas.