0

我的 Arduino 代码有问题。我正在尝试将收集到的 GPS 位置发送到我的网络服务器,但网络服务器将其显示为字符串而不是数字。

这是我的 Arduino GPS 代码:

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;


TinyGPSPlus gps;


SoftwareSerial ss(RXPin, TXPin);

void setup()
{
    Serial.begin(115200);
    ss.begin(GPSBaud);

}

void loop()
{

    while (ss.available() > 0)
        if (gps.encode(ss.read()))
            displayInfo();

    if (millis() > 5000 && gps.charsProcessed() < 10)
    {
        Serial.println(F("No GPS detected: check wiring."));
        while (true);
    }
}

void displayInfo()
{
    Serial.print(F("Location: "));
    if (gps.location.isValid())
    {
        Serial.print(gps.location.lat(), 6);
        Serial.print(F(","));
        Serial.print(gps.location.lng(), 6);
    }
    else
    {
        Serial.print(F("INVALID"));
    }

    Serial.println();
}

我想将“gps.location.lat”和“gps.location.lng”转换为字符,以便我的网络服务器可以显示数字而不是字符串。也许我的逻辑是错误的?

这是我的 HTTP 请求的原始代码:

#include <SoftwareSerial.h>
SoftwareSerial GSM(7, 8); // RX, TX

enum _parseState {
 PS_DETECT_MSG_TYPE,

 PS_IGNORING_COMMAND_ECHO,

 PS_HTTPACTION_TYPE,
 PS_HTTPACTION_RESULT,
 PS_HTTPACTION_LENGTH,

 PS_HTTPREAD_LENGTH,
 PS_HTTPREAD_CONTENT
};

enum _actionState {
AS_IDLE,
AS_WAITING_FOR_RESPONSE
};

byte actionState = AS_IDLE;
unsigned long lastActionTime = 0;

 byte parseState = PS_DETECT_MSG_TYPE;
 char buffer[80];
 byte pos = 0;

 int contentLength = 0;

 void resetBuffer() {
 memset(buffer, 0, sizeof(buffer));
  pos = 0;
 }

 void sendGSM(const char* msg, int waitMs = 500) {
 GSM.println(msg);
 while(GSM.available()) {
   parseATText(GSM.read());
 }
 delay(waitMs);
 }

 void setup()
  {
  GSM.begin(9600);
  Serial.begin(9600);

 sendGSM("AT+SAPBR=3,1,\"APN\",\"vodafone\"");  
 sendGSM("AT+SAPBR=1,1",3000);
 sendGSM("AT+HTTPINIT");  
 sendGSM("AT+HTTPPARA=\"CID\",1");

 }

void loop()
 { 
 unsigned long now = millis();

 if ( actionState == AS_IDLE ) {
  if ( now > lastActionTime + 5000 ) {
  sendGSM("AT+HTTPPARA=\"URL\",\"http://www.iforce2d.net/test.php\"");
  sendGSM("AT+HTTPACTION=0");
  lastActionTime = now;
  actionState = AS_WAITING_FOR_RESPONSE;
  }
 }

 while(GSM.available()) {
  lastActionTime = now;
  parseATText(GSM.read());
 }
 }

 void parseATText(byte b) {

 buffer[pos++] = b;

  if ( pos >= sizeof(buffer) )
  resetBuffer(); // just to be safe

 switch (parseState) {
 case PS_DETECT_MSG_TYPE: 
   {
  if ( b == '\n' )
    resetBuffer();
  else {        
    if ( pos == 3 && strcmp(buffer, "AT+") == 0 ) {
      parseState = PS_IGNORING_COMMAND_ECHO;
    }
    else if ( b == ':' ) {
      //Serial.print("Checking message type: ");
      //Serial.println(buffer);

      if ( strcmp(buffer, "+HTTPACTION:") == 0 ) {
        Serial.println("Received HTTPACTION");
        parseState = PS_HTTPACTION_TYPE;
      }
      else if ( strcmp(buffer, "+HTTPREAD:") == 0 ) {
        Serial.println("Received HTTPREAD");            
        parseState = PS_HTTPREAD_LENGTH;
      }
      resetBuffer();
    }
    }
   }
   break;

  case PS_IGNORING_COMMAND_ECHO:
   {
    if ( b == '\n' ) {
    Serial.print("Ignoring echo: ");
    Serial.println(buffer);
    parseState = PS_DETECT_MSG_TYPE;
     resetBuffer();
    }
  }
   break;

   case PS_HTTPACTION_TYPE:
   {
    if ( b == ',' ) {
    Serial.print("HTTPACTION type is ");
    Serial.println(buffer);
    parseState = PS_HTTPACTION_RESULT;
    resetBuffer();
    }
   }
   break;

  case PS_HTTPACTION_RESULT:
  {
    if ( b == ',' ) {
    Serial.print("HTTPACTION result is ");
    Serial.println(buffer);
    parseState = PS_HTTPACTION_LENGTH;
    resetBuffer();
    }
   }
   break;

   case PS_HTTPACTION_LENGTH:
   {
  if ( b == '\n' ) {
    Serial.print("HTTPACTION length is ");
    Serial.println(buffer);

    // now request content
    GSM.print("AT+HTTPREAD=0,");
    GSM.println(buffer);

    parseState = PS_DETECT_MSG_TYPE;
    resetBuffer();
  }
   }
  break;

  case PS_HTTPREAD_LENGTH:
   {
     if ( b == '\n' ) {
     contentLength = atoi(buffer);
    Serial.print("HTTPREAD length is ");
    Serial.println(contentLength);

    Serial.print("HTTPREAD content: ");

    parseState = PS_HTTPREAD_CONTENT;
    resetBuffer();
  }
}
break;

  case PS_HTTPREAD_CONTENT:
   {

  Serial.write(b);

  contentLength--;

  if ( contentLength <= 0 ) {

    // all content bytes have now been read

    parseState = PS_DETECT_MSG_TYPE;
    resetBuffer();

    Serial.print("\n\n\n");

    actionState = AS_IDLE;
  }
}
break;
  }
  }
4

0 回答 0