2013-07-09 5 views
3

나는 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"변수를수록

, 나는뿐만 아니라 그것을 살펴 했어 > 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..."); 
    } 
    } 
} 

- -> 요청 모뎀

: 디버깅을 위해 관련 변수는 다음 코드로 마지막 두 가지 기능을 변경했습니다

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();

정확한 문제의 원인 또는 원인을 알고 있습니까?

답변

6

네트워크 등록 정보 (CREG) 출력은 모뎀 구성에 따라 다릅니다. "+ CREG = 0"전송함으로써

  1. 하나 "는 하나의 전송함으로써 네트워크에 등록
  2. 을 사용할 수"= 1 + CREG AT "전송함으로써
  3. (케이스이다) 네트워크 등록 코드를 비활성화 할 + CREG AT = 2 "하나
    위치 정보를 네트워크에 등록 코드 (위치 영역 코드 및 셀 ID)

옵션 2 및 3는 자동 발광 + 것을 사용할 수 모뎀 부팅/네트워크 변경시 CREG 메시지 .


추신 : 하나

"COMMAND에 설명서 SIM900"에서 찾을 수있다 CREG에

자세한 W & AT 실행하여 구성 AT 전류 저장 잊지 말아야