GSM и GPS-модуль не работают вместе

Я пытаюсь создать проект, который включает в себя получение широты и долготы с помощью модуля GPS и отправку его через GSM-модуль. Моя проблема здесь в том, что индивидуальный код работает идеально. Однако, если я инициализирую оба вместе, ни один из них не будет работать.

#include "GSM.h"//wrapper class for Sim800l library
#include "GPS.h"//wrapper class for TinyGPS library
GSM *gsm;
GPS *gps;
void setup()
{
    Serial.begin(9600); // Debugging only
    gsm = new GSM();//initializes SIM800l 
    //gps = new GPS(11,10 );//initializes NEO6MV2//uncommmenting this line won't make both modules work
}
String telNum;
int i = 1;
void loop()
{
    /*
    Serial.println(gps->getLongitude(),6);
    Serial.println(gps->getLatitude(),6);
    */

    Serial.println(gsm->read(i,telNum));
    Serial.println(telNum);
     ++i;
}

, 👍2

Обсуждение

похоже, вам нужно указать последовательные контакты программного обеспечения., @dandavis

кроме того, это не устройство 5 В, и ваш красный провод никуда не уходит ;), @dandavis

В оригинальных библиотеках используется программное обеспечение serial. Или, может быть, я не понял тебя @dandavis, @Kinyo356


3 ответа


Лучший ответ:

1

Я заставил его работать, инициализировав и удалив указатель на объект GPS и GSM.

Инициализация и освобождение объектов выполняются в функции цикла. Я инициализирую GPS, запускаю его в цикле на некоторое время, уничтожаю его и инициализирую GSM и ту же процедуру, что и GPS.

Хотя я не знаю, будет ли это иметь какие-либо последствия, но он работает идеально

#include "GSM.h"
#include "GPS.h"
GSM *gsm;
GPS *gps;
void setup()
{
    Serial.begin(9600); // Debugging only
}

unsigned long previousMillis = 0;//could be any value depending on how quick you want it to elapse
const long interval = 100; //could be any value depending on how long you want it to run
void loop()
{
    gps = new GPS(6, 7);//initialization <SoftwareSerial::begin() function called here>
    while (previousMillis <= interval) 
    {       
        //GPS codes here
        ++previousMillis;
    }
    delete gps;         //destory initialized object
    previousMillis = 0; //reset value

    gsm = new GSM();    //initialization <SoftwareSerial::begin() function called here>
    while (previousMillis <= interval)
    {

        //GSM codes here
        ++previousMillis;
    }
    delete gsm;//destory initialized object

    previousMillis = 00;//reset value
}
,

0

Вы не можете использовать два программных устройства вместе (или ненадежно, и не зная точно, что вы делаете).

Даже нелегко использовать одно программное обеспечение и одну аппаратную серию вместе, если вы не знаете, что делаете.

SoftwareSerial блокирует все остальное во время отправки или получения, поэтому его использование для отправки нежелательных сообщений (как это постоянно делают GPSS) приводит к хаосу.

Лучшее, на что вы можете надеяться,-это использовать HardwareSerial для GPS и SoftwareSerial для GSM, что большую часть времени связано с вызовом и ответом.

Лучше было бы использовать лучшую плату, имеющую несколько аппаратных последовательных портов.

,

ОК. У вас есть какая-нибудь ссылка, которая может провести меня через аппаратный серийный номер? Googling просто продолжает вызывать библиотеки и никаких примеров., @Kinyo356


0

Вы можете использовать функцию прослушивания , например:

First_softwareserial.listen();// когда вам нужен gsm-serial
Second_softwareserial.listen();// когда вам нужен gps-последовательный
,

но обе библиотеки в этом вопросе имеют встроенный SoftwareSerial. поэтому покажите, как использовать их так, как вы описываете, @Juraj