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( );
なぜ、または正確な問題が何か分かりますか?