4

IComsat SIM900 GSM/GPRS シールドが取り付けられた Arduino UNO を使用しています。次のチュートリアルを使用します: Arduino Live GPS Tracker AT+CREG に行き詰まっていますか? コマンドは、SIM カードがプロバイダーに登録されているかどうかを確認します。

次のロジックが使用されます。「void setup()」関数内の GSM_HTTP.INO ファイルで、次の行が実行された 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
  }
}

関数「checkNetwork()」は、含まれているライブラリ GSM862.cpp の一部であり、次のようになります。

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;
  }
}

これは重要な部分です: 関数 "requestModem" によって受信される "result" の値は、不可解な値を返しますが、ネットワーク ステータス (番号 0-5) を返しません。これが、エラーなしで登録しようとする無限ループがある理由です成功メッセージ。

この関数は、GSM862.cpp の関数「requestModem」から「buf」変数を取得するので、それも調べました。

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;
}

デバッグ目的で関連する変数を調べるために、最後の 2 つの関数を次のコードに変更しました。

-->チェックネットワーク

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...");
    }
  }
}

--> モデムをリクエスト

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;
}

上で述べたように、実際には「buf[21]」の値である関数「checkNetwork」の「結果」の値は、Serial.println( );

なぜ、または正確な問題が何か分かりますか?

4

1 に答える 1

7

ネットワーク登録情報 (CREG) の出力は、モデムの構成によって異なります。

  1. 「AT + CREG = 0」を送信することにより、ネットワーク登録コードを無効にすることができます(これはあなたの場合です)
  2. 「AT+CREG=1」を送信することで、ネットワーク登録を有効にすることができます
  3. 「AT+CREG=2」を送信することで、
    位置情報 (ロケーション エリア コー​​ドとセル ID)を含むネットワーク登録コードを有効にすることができます。

オプション 2. および 3. は、モデムの起動/ネットワークの変更時に +CREG メッセージも自動的に発行します。


ps: AT&W を実行して現在の AT 構成を保存することを忘れないでください。

CREG の詳細については、「SIM900 AT コマンド マニュアル」を参照してください。

于 2014-06-18T20:21:19.000 に答える