나는 IComsat SIM900 GSM/GPRS 방패가 부착 된 Arduino UNO를 사용하고 있습니다. 다음 자습서를 사용하십시오. Arduino Live GPS Tracker AT + CREG가 붙어 있습니까? SIM 카드가 공급자에 등록되어 있는지 확인하는 명령.SIM900 GSM/GPRS가 올바른 AT + CREG를 얻지 못합니까? 대답
다음 논리가 사용됩니다. "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"이받은 값은 암호 값을 반환하지만 오류 또는 성공 메시지없이 등록하려고하는 무한 루프가있는 네트워크 상태 (숫자 0-5)가 없습니다.
을 위해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;
}
가로 모양을 가지고 :
이 기능이 GSM862.cpp의 기능 "requestModem"밖으로 "BUF"변수를수록
, 나는뿐만 아니라 그것을 살펴 했어 > checkNetworkvoid 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"함수의 "result"값은 "buf [21]"에 표시 될 때 암호 값을 표시합니다. 터미널을 통해 Serial.println();
정확한 문제의 원인 또는 원인을 알고 있습니까?