Я использую плату Elecrow A9 с GSM и GPS и пытаюсь написать набросок, который позволит мне управлять им через SMS.Мой первый шаг - заставить его читать положение с GPS и распечатывать его на серийный номер.Эскиз компилируется, загружается и запускается, но не попадает в цикл while (gps.available( A9board )) {
.
Что-то мне не хватает?
Вот соответствующая часть моего эскиза:
#include <NMEAGPS.h>
#define A9board Serial1 // Best: Serial1 on a Mega, Leo or Due
// or
//#include <AltSoftSerial.h>
//AltSoftSerial A9board; Next best, but you must use pins 8 & 9! This is very efficient.
// or
//#include <NeoSWSerial.h>
//NeoSWSerial A9thinker( 10, 11 ); // 2nd best on whatever two pins you want. Almost as efficient.
NMEAGPS gps;
gps_fix fix;
// Finite-State Machine declarations
enum state_t
{
WAITING, // until time to check again
GPS_ON_WAIT, // after AT+GPS=1
GPS_READING, // after AT+GPSRD=1
GPS_READING_WAIT, // after location received, AT+GPSRD=0
GPS_OFF_WAIT, // after AT+GPS=0
SENDING_SMS
// other states?
};
state_t state = WAITING; // start here
uint32_t stateTime ; // used for timeouts, instead of delay
const uint32_t CHECK_LOCATION_TIME = 5000; // ms, how often to check
void echoA9chars()
{
if (A9board.available())
Serial.write( A9board.read() ); // just echo what we are receiving
}
void ignoreA9chars()
{
if (A9board.available())
A9board.read(); // ignore what we are receiving
}
void setup()
{
Serial.begin( 115200 );
A9board.begin( 9600 );
stateTime = millis();
}
void loop()
{
switch (state) {
case WAITING:
//Serial.println("WAITING");
echoA9chars();
if (millis() - stateTime >= CHECK_LOCATION_TIME) {
// Turn GPS data on
A9board.println( F("AT+GPS=1") );
stateTime = millis();
state = GPS_ON_WAIT;
}
break;
case GPS_ON_WAIT:
//Serial.println("GPS_ON_WAIT");
echoA9chars();
// Wait for the GPS to turn on and acquire a fix
if (millis() - stateTime >= 5000) { // 5 seconds
// Request GPS data
A9board.println( F("AT+GPSRD=1") );
Serial.print( F("Waiting for GPS fix...") );
stateTime = millis();
state = GPS_READING;
}
break;
case GPS_READING:
Serial.println("GPS_READING");
while (gps.available( A9board )) { // parse the NMEA data
Serial.println("gps available");
fix = gps.read(); // this structure now contains all the GPS fields
Serial.print(fix.status);
if (fix.status) {
Serial.println("Fix status");
Serial.print(fix.status);
}
if (fix.valid.location) {
Serial.println();
// Now that we have a fix, turn GPS data off
A9board.println( F("AT+GPSRD=0") );
stateTime = millis();
state = GPS_READING_WAIT;
}
}
if (millis() - stateTime > 1000) {
Serial.print( '.' ); // still waiting for fix, print a dot.
stateTime = millis();
}
break;