2016-09-12 24 views
0

私はGSM経由で自分の番号にGPS座標を受信しようとしています。私のコードはループに入れても一度だけ私に送信しますが、私は文字を(e-g: '#')一度だけ送ることによって私の回路を起動させた後、それらを連続して受信したいと思います。何が間違っているか教えてください。GPS座標を連続的に送信する

#include <TinyGPS.h> 

// create variable for latitude and longitude object 
long lat,lon; 

// create gps object 
TinyGPS gps; 

//for storing incoming character from sms 
char inchar; 

void setup() 
{ 
    Serial.begin(9600); // connect mega 
    Serial1.begin(9600); // connect GSM 
    Serial2.begin(9600); // connect gps 
    delay(1000); 
    Serial1.print("AT+CMGF=1\r"); //reads string instead of hexadecimal from incoming sms 
    Serial1.print("AT+CNMI=1,2,0,0,0"); //select storage to read sms from 
    Serial.println("Ready..."); 
    delay(1000); 
} 

void loop() 
{ 
    while(true) 
{ 
    if(Serial1.available()) 
    { 
    inchar = Serial1.read(); 
    Serial.println(inchar); 
    } 
    if(inchar == '#') 
    { 
     getData(); 
    } 
} 
}//finish loop 



void getData()  
{ 
    while(true) 
    { 
    if(Serial2.available()>0) // check for gps data 
    { 
     if(gps.encode(Serial2.read())) // encode gps data 
     break; 
    } 
    }  
    gps.get_position(&lat,&lon); // get latitude and longitude 
    displayInfo(); 
    sendInfo(); 
    Serial.println("In getdata"); 
} 

void displayInfo() 
{ 
    Serial.print("Position: "); 
    Serial.print("lat: "); Serial.print(lat); Serial.print(" ");// print latitude 
    Serial.print("lon: "); Serial.println(lon); // print longitude 
} //end displayInfo() 

void sendInfo() 
{ 
    Serial1.print("AA"); 
    delay(1000); //delay of 1 
    Serial1.println("AT"); 
    delay(1000); 
    Serial1.write("AT+CMGF=1\r\n");   //set GSM to text mode 
    delay(1500); 
    Serial1.write("AT+CPMS=\"SM\"\r\n");   //Preferred SMS Message Storage 
    delay(1000); 
    Serial1.write("AT+CMGS=\"03360234233\"\r");   //set GSM to text mode 
    delay(1500); 
    Serial1.print(lat); Serial1.print(" "); Serial1.print(lon);//set GSM to text mode 
    delay(1500); 
    Serial1.write(0x1A);   // sends ctrl+z end of message 
    delay(1500); 
    Serial.println("sms sent "); 
} //end sendInfo() 

答えて

0

あなたはそれがおそらくinchar変数に置き換え改行文字「\ n」が、続いて「#」文字を送信します。より良いアプローチは、データを送信するためにあなたのコードを通知しますフラグを設定するために、次のようになります。ところで

bool sendData = false; 
// setup etc. 
void loop() 
{ 

    if(Serial1.available()) 
    { 
    inchar = Serial1.read(); 
    Serial.println(inchar); 
    if(inchar == '#') sendData = true; 
    } 
    if(sendData) 
    { 
     getData(); 
    } 

} 

:あなたはloop()関数内while(true)を必要としません。名前が示すように、それはすでに永遠に繰り返す。

関連する問題