SIM900 GSM/GPRS pas à obtenir un bon AT+CREG? réponse

Je suis en utilisant un Arduino UNO avec joint IComsat SIM900 GSM/GPRS shield.
En utilisant le tutoriel suivant: Arduino Live Tracker GPS je suis coincé avec l'AT+CREG? commande, qui vérifie si la carte SIM est enregistré chez le fournisseur.

La logique suivante est utilisée:
Dans le GSM_HTTP.INO fichier dans le "void setup ()", la ligne suivante est exécutée modem.checkNetwork();

void setup() {           
  Serial.begin(9600); 
  Serial.println("GM862 monitor");
  modem.switchOn();                   //switch the modem on
  delay(4000);                        //wait for the modem to boot
  modem.init();                       //initialize the GSM part of Module
  modem.version();                    //request modem version info
  while (!modem.isRegistered()) {
    delay(1000);
    modem.checkNetwork();             //check the network availability
  }
}

La fonction "checkNetwork()" fait partie de la bibliothèque incluse GSM862.cpp et ressemble à ceci:

void GM862::checkNetwork() {
  char buf[BUF_LENGTH];
  char result;
  requestModem("AT+CREG?", 1000, true, buf);
  result = buf[21];

  if (result == '1') {
    state |= STATE_REGISTERED;
  }
  else {
    state &= ~STATE_REGISTERED;
  }
}

Maintenant, c'est la partie importante: La valeur de "résultat" qui obtient reçu par la fonction "requestModem" renvoie cryptique de valeurs, mais pas netword statut (nombre de 0 à 5) qui est pourquoi il est une boucle sans fin en essayant de s'inscrire sans erreur ou un message de réussite.

Que cette fonction obtient le "buf" variable de la fonction "requestModem" GSM862.cpp j'ai eu un coup d'oeil:

byte GM862::requestModem(const char *command, uint16_t timeout, boolean check, char *buf) {

  byte count = 0;

  *buf = 0;

  modem->flush();
  modem->println(command);
  count = getsTimeout(buf, timeout);
  return count;
}

Afin d'avoir un regard sur les variables pertinentes à des fins de débogage, j'ai changé les deux dernières fonctions dans le code suivant:

-->checkNetwork

void GSM862::checkNetwork() {
  char buf[BUF_LENGTH];
  char result;
  requestModem("AT+CREG?", 1000, true, buf);
  result = buf[21];

  Serial.print("Debugging buf2:");
  Serial.print(buf[21]);
  Serial.print("Debugging buf2:");
  Serial.print(buf[1]);
  Serial.print("Debugging buf2:");
  Serial.print(buf[0]);
  Serial.print("Debugging result2:");
  Serial.println(result);

  if (result == '1') {
    state |= STATE_REGISTERED;

    Serial.println("Network registered, home network...");
  }
  else {
    state &= ~STATE_REGISTERED;

    if(result == '0'){
      Serial.println("Network not registered, not searching for a new operator to register to...");
    }
    if(result == '2'){
      Serial.println("Still searching for an operators network to register to...");
    }
    if(result == '3'){
      Serial.println("Network registration denied...");
    }
    if(result == '4'){
      Serial.println("Network registration state unknown, probably still starting up...");
    }
    if(result == '5'){
      Serial.println("Network registered, roaming...");
    }
  }
}

--> demande de Modem

byte GSM862::requestModem(const char *command, uint16_t timeout, boolean check, char *buf) {

  byte count = 0;

  *buf = 0;

  modem->flush();
  modem->println(command);
  count = getsTimeout(buf, timeout);

  Serial.print("Debugging command1:");
  Serial.println(command);
  Serial.print("Debugging count1:");
  Serial.println(count);
  Serial.print("Debugging buf1:");
  Serial.println(buf);
  Serial.print("Debugging timeout1:");
  Serial.println(timeout);

  return count;
}

Comme je l'ai mentionné ci-dessus, il semble que la valeur de "résultat" de la fonction "checkNetwork" qui est en fait la valeur de "buf[21]", affiche une énigme de valeur lorsqu'elles sont affichées sur le terminal via un port Série.println();

Avez-vous une idée de pourquoi ou le problème?

OriginalL'auteur Daniel | 2013-07-09