2016-06-20 9 views
0

ist es Arduino-Programm für GSM und GPS-Modem. In diesem GPS-Modem senden Sie den Standort an den Benutzer mit Hilfe von GSM-Modem, aber diesen Fehler kontinuierlich zu bekommen.sendATCommand nicht in diesem Bereich angegeben

hier das Programm ich bin immer dies immer wieder auch nach einigen Änderungen für das Programm ATCommand für die SIM908 Modul ist int8_t Antwort;

int onModulePin= 2; 
char aux_string[30]; 
int flag = 0; 

char number [20]; 
char realnumber[9]; 
char mynumber[9]; 

int a=0; 
int b=0; 
int c=0; 

//Your phone number 

char phone_number[]="85274****5"; 


char data[100]; 
int data_size; 
char aux_str[30]; 
char aux; 

int x = 0; 
char N_S,W_E; 



char frame[200]; 
char latitude[15]; 
char longitude[15]; 
char altitude[6]; 
char date[16]; 

char time[7]; 

char satellites[3]; 
char speedOTG[10]; 
char course[10]; 


void setup(){ 
    mynumber[0]='8'; 
    mynumber[1]='5'; 
    mynumber[2]='2'; 
    mynumber[3]='7'; 
    mynumber[4]='4'; 
    mynumber[5]='*'; 
    mynumber[6]='*'; 
    mynumber[7]='*'; 
    mynumber[8]='*'; 
    mynumber[9]='5'; 


    pinMode(onModulePin, OUTPUT); Serial.begin(115200); 



    delay(5000); 


    sendATcommand("AT+CPIN=****", "OK", 2000); 


    delay(3000); 


    while((sendATcommand("AT+CREG?", "+CREG: 0,1", 1000) ||   sendATcommand("AT+CREG?", "+CREG: 0,5", 1000)) == 0); 


    sendATcommand("AT+CLIP=1", "OK", 1000); 


    while (start_GPS() == 0); 


    while (sendATcommand("AT+CREG?", "+CREG: 0,1", 2000) == 0); 


    // sets APN , user name and password   
    sendATcommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK", 2000); 
    sendATcommand("AT+SAPBR=3,1,\"APN\",\"*******\"", "OK",2000); 
    sendATcommand("AT+SAPBR=3,1,\"USER\",\"*******\"","OK", 2000); 
    sendATcommand("AT+SAPBR=3,1,\"PWD\",\"*******\"", "OK",2000); 


    // gets the GPRS bearer 

    while (sendATcommand("AT+SAPBR=1,1", "OK", 20000) == 0) 

    { 

    delay(5000); 

    } 


    delay(1000); 

    while(Serial.available() != 0) 

    { 

    Serial.read(); 

    } 

    } 

    void loop(){ 


    answer = sendATcommand("", "+CLIP", 1000); //Detect incomming call 

    if (answer == 1) 

{ 

    Serial.println("Incoming call"); 


    if (flag == 0){ 


    for (int i=0; i<19; i++){ // read the incoming byte: 


    while (Serial.available() == 0) 

{ 

delay (50); 

} 

//Stores phone number number[i] = Serial.read(); 


} 

Serial.flush(); flag = 1; 

} 

    //Stores phone calling number for (int i=0; i<=14; i++){ 

if(number[i]== '"'){  i++; 
realnumber[0]=number[i]; i++; 
realnumber[1]=number[i]; i++; 
realnumber[2]=number[i]; i++; 
realnumber[3]=number[i]; i++; 
realnumber[4]=number[i]; i++; 
realnumber[5]=number[i]; i++; 
realnumber[6]=number[i]; i++; 
realnumber[7]=number[i]; i++; 
realnumber[8]=number[i]; 

break; 

} 

} 


    //Check phone number for (int i=0;i<9;i++){ 

if (realnumber[i] == mynumber[i]){ a++; 

if(a==9){ 

Serial.println("Correct number"); sendATcommand("ATH", "OK", 1000); 

if(b==1){ b=0; 
}else{ b=1; c=1; 
} 

break; 

} 

}else{ 

Serial.println("Wrong number"); break; 

} 

} 

a=0; answer=0; flag = 0; 

} 

//Send SMS once and position to HTTP if (b==1){ 

get_GPS(); send_HTTP(); delay(500); 

if (c==1){ sendSMS(); delay(100); 

c=0; 

} 

} 


} 


void power_on(){ 


uint8_t answer=0; 


digitalWrite(onModulePin,HIGH); delay(3000); 
    digitalWrite(onModulePin,LOW); 

while (answer == 0){ // Send AT every two seconds 
and wait for the answer 

answer = sendATcommand("AT", "OK", 2000); 

    } 

} 


int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){ 


uint8_t x=0, answer=0; char response[100]; unsigned long previous; 

    memset(response, '\0' , 100);  // Initialice the string         
    delay(100);       
    while (Serial.available() > 0) Serial.read(); //Clean the input buffer   
    if (ATcommand[ 0 ] != '\0' )   

    {           

    Serial.println(ATcommand);   
    } 

    x = 0; 
    previous = millis(); 


    // this loop waits for the answer do{ 

    if(Serial.available() != 0){ // if there are data in the UART input buffer, reads it and checks for the asnwer 

response[x] = Serial.read(); //Serial.print(response[x]); 

x++; 

if (strstr(response, expected_answer) != NULL) // check if the desired answer (OK) is in the response of the module 

{ 

answer = 1; 

} 

} 

}while((answer == 0) && ((millis() - previous) <timeout)); // Waits for the asnwer with time out 


    return answer; 

    } 


    void power_onGPS(){ 

    uint8_t answer=0; // checks if the module is started 

    answer = sendATcommand("AT", "OK", 2000); if (answer == 0) 

    { 

// power on pulse 
digitalWrite(onModulePin,HIGH); delay(3000); digitalWrite(onModulePin,LOW); 

    // waits for an answer from the module while(answer == 0){ 

    // Send AT every two seconds and wait for the answer 

    answer = sendATcommand("AT", "OK", 2000); 

} 

} 


} 


int8_t start_GPS(){ 


unsigned long previous; 


previous = millis(); // starts the GPS 

    sendATcommand("AT+CGPSPWR=1", "OK", 2000); sendATcommand("AT+CGPSRST=0", "OK", 2000); 

// waits for fix GPS 

while(((sendATcommand("AT+CGPSSTATUS?", "2D Fix", 5000) || 

sendATcommand("AT+CGPSSTATUS?", "3D Fix", 5000)) ==0) && 

((millis() - previous) < 90000)); 


if ((millis() - previous) < 90000) 

{ 

return 1; 

} 

else 

{ 

return 0; 

} 

} 


int8_t get_GPS(){ 


int8_t counter, answer; long previous; 


// First get the NMEA string // Clean the input buffer 

while(Serial.available() > 0) Serial.read(); // request Basic string 

sendATcommand("AT+CGPSINF=0", "AT+CGPSINF=0\r\n\r\n", 2000); 


counter = 0; answer = 0; 

memset(frame, '\0', 100); // Initialize the string previous = millis(); 

// this loop waits for the NMEA string do{ 


if(Serial.available() != 0){ frame[counter] = Serial.read(); counter++; 

// check if the desired answer is in the response of the module 

if (strstr(frame, "OK") != NULL) 

{ 

answer = 1; 

} 

} 

// Waits for the asnwer with time out 


} 

while((answer == 0) && ((millis() - previous) < 2000)); 


frame[counter-3] = '\0'; 


// Parses the string strtok(frame, ","); 

strcpy(longitude,strtok(NULL, ",")); // Gets longitude  
strcpy(latitude,strtok(NULL, ",")); // Gets latitude  
strcpy(altitude,strtok(NULL, ".")); // Gets altitude 
strtok(NULL, ","); 

strcpy(date,strtok(NULL, ".")); // Gets date strtok(NULL, ","); 

strtok(NULL, ","); strcpy(satellites,strtok(NULL, ",")); // Gets satellites 

strcpy(speedOTG,strtok(NULL, ",")); // Gets speed over ground. Unit is knots. 

strcpy(course,strtok(NULL, "\r")); // Gets course 


convert2Degrees(latitude); 

    convert2Degrees(longitude); 


return answer; 

} 


    /* convert2Degrees (input) - performs the conversion from input 

* parameters in DD°MM.mmm’ notation to DD.dddddd° notation. 


* Sign '+' is set for positive latitudes/longitudes (North, East) 

* Sign '-' is set for negative latitudes/longitudes (South, West) 


*/ 

int8_t convert2Degrees(char* input){ 


float deg; 

float minutes; boolean neg = false; //auxiliar variable char aux[10]; 

if (input[0] == '-') 

{ 

neg = true; 

strcpy(aux, strtok(input+1, ".")); 


} 

else 

{ 

    strcpy(aux, strtok(input, ".")); 

    } // convert string to integer and add it to final float variable 

    deg = atof(aux); 


    strcpy(aux, strtok(NULL, '\0')); minutes=atof(aux); minutes/=1000000; 
    if (deg < 100) 

    { 

    minutes += deg; deg = 0; 

    } 

    else 


{ 

    minutes += int(deg) % 100; deg = int(deg)/100; 

} // add minutes to degrees deg=deg+minutes/60; 

if (neg == true) 

{ 

deg*=-1.0; 

} 


neg = false; 


if(deg < 0){ neg = true; deg*=-1; 

} 


float numberFloat=deg; int intPart[10]; 

int digit; 

long newNumber=(long)numberFloat; int size=0; 


while(1){ size=size+1; digit=newNumber%10; 
newNumber=newNumber/10; intPart[size-1]=digit; 

if (newNumber==0){ break; 

} 

} 


int index=0; 

if(neg){ index++; input[0]='-'; 

} 

for (int i=size-1; i >= 0; i--) 

{ 

input[index]=intPart[i]+'0'; index++; 

} 


input[index]='.'; index++; 


numberFloat=(numberFloat-(int)numberFloat); for (int i=1; i<=6 ; i++) 

{ 

numberFloat=numberFloat*10; digit= (long)numberFloat; numberFloat=numberFloat-digit; input[index]=char(digit)+48; index++; 
} 

input[index]='\0'; 


} 


void send_HTTP(){ 


uint8_t answer=0; // Initializes HTTP service 

answer = sendATcommand("AT+HTTPINIT", "OK", 10000); if (answer == 1) 

{ // Sets CID parameter 

answer = sendATcommand("AT+HTTPPARA=\"CID\",1", "OK", 5000); 
if (answer == 1) 

{ 

// Sets url sprintf(aux_str, 

"AT+HTTPPARA=\"URL\",\"http://%s/demo_sim908.php?", url);  Serial.print(aux_str); 

sprintf(frame, 

"visor=false&latitude=%s&longitude=%s&altitude=%s&time=%s&s atellites=%s&speedOTG=%s&course=%s", 

latitude, longitude, altitude, date, satellites, speedOTG, course); 

Serial.print(frame); 

answer = sendATcommand("\"", "OK", 5000); if (answer == 1) 

{ 

    // Starts GET action 

    answer = sendATcommand("AT+HTTPACTION=0", "+HTTPACTION:0,200", 30000); 
    if (answer == 1) 

{ 


    Serial.println(F("Done!")); 

} 

    else 

    { 

    Serial.println(F("Error getting url")); 

    } 


    } 

else 

{ 

Serial.println(F("Error setting the url")); 



} 

} 

else 

{ 

Serial.println(F("Error setting the CID")); 

} 

} 

else 

{ 

    Serial.println(F("Error initializating")); 

    } 


    sendATcommand("AT+HTTPTERM", "OK", 5000); 


    } 


    void power_onSMS(){ 

    uint8_t answer=0; // checks if the module is started 

    answer = sendATcommand("AT", "OK", 2000); if (answer == 0) 

    { 

    // power on pulse digitalWrite(onModulePin,HIGH); delay(3000); digitalWrite(onModulePin,LOW); 

    // waits for an answer from the module 
    while  
    (answer == 0 ){  

    answer = sendATcommand("AT", "OK", 2000); 

     } 

    } 

     } 


     void sendSMS(){ sendATcommand("AT+CPIN=****", "OK", 2000); 


    delay(3000); 


    Serial.println("Connecting to the network..."); 


    while((sendATcommand("AT+CREG?", "+CREG: 0,1", 500) || sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) 




    Serial.print("Setting SMS mode..."); sendATcommand("AT+CMGF=1", "OK", 1000); // sets theSMS mode to text 
    Serial.println("Sending SMS"); 


    sprintf(aux_string,"AT+CMGS=\"%s\"", phone_number); answer = sendATcommand(aux_string, ">", 2000); // 

send the SMS number if (answer == 1) 

{ 

    Serial.print("Theft Alert:"); 

    Serial.print("Latitude: "); int i = 0; while(latitude[i]!=0){ 

    Serial.print(latitude[i]); 

    i++; 

} 

Serial.print("/Longitude: "); i = 0; 

while(longitude[i]!=0){ Serial.print(longitude[i]); 


i++; 

} 

Serial.write(0x1A); 

answer = sendATcommand("", "OK", 20000); if (answer == 1) 

{ 

Serial.print("Sent "); 

} 

else 

{ 

Serial.print("error "); 

} 

} 

else 

{ 

Serial.print("error "); Serial.println(answer, DEC); 

} 


} 

enter image description here

+0

Bitte veröffentlichen Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve), da niemand gerne mehrere Seiten Code liest, um Ihren speziellen Fehler zu finden. In diesem Fall ist es ziemlich offensichtlich (Sie verwenden die Funktion vor der Deklaration), aber das ist nicht immer richtig. – Anedar

+0

'' '#include" Sim908.h "' '' Ich denke –

+0

Der ganze Code wird als Referenz angegeben, wenn ein Körper interessiert ist, aber Sie können den Fehler im Bild sehen, und ich habe den Befehl viele Male darüber verwendet, wo es gibt kein Fehler, aber in dieser Anweisung rief es einen Fehler – rohitpanwar77

Antwort

0

Wenn Sie Funktion

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout) 

vor der ersten Nutzung (vor setup() Funktion) bewegen sollte es funktionieren.

+0

, wenn ich diese Anweisung einfügen, dann wird es den sendATcommand ändern, um eine definierte Verbindung zu sein, während in weiteren ich muss das in char ändern, was ein Problem sein wird – rohitpanwar77

Verwandte Themen