持续发送 GPS 坐标

Sending GPS coordinates continuously

我正在尝试通过 GSM 在我的号码上接收 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()

当您发送“#”字符时,它后面可能会跟一个换行符“\n”,它会在 inchar 变量中替换它。更好的方法是设置一个标志,指示您的代码发送数据:

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)。顾名思义,它已经永远循环了。