Arduino Nano mit zwei Seriellenschnittstellen

Hallo Zusammen,

Ich möchte an meinen Arduino ein SIM800l und ein GPS Modul verbinden. Allerdings wird nur die Schnittstelle aktiv die ich im Setup zuerst eröffne. Woran liegt das, bzw wie kann ich beide Schnittstellen eröffnen?

Nicht wundern. Die Pins und die Softwareserialclass werden für das SIM800l in der Bibliothek erstellt, wurden also nicht vergessen. Seperat funktioniert beides. Nur zusammen nicht.

#include <Sim800l.h>

#include <TinyGPS++.h>

#include <SoftwareSerial.h>
Sim800l Sim800l;  //to declare the library

//GPS
#define RXD2 6
#define TXD2 5
#define GPS_BAUD 9600
TinyGPSPlus gps;
SoftwareSerial gpsSerial(RXD2,TXD2);

//SMS
String textSms,numberSms;
uint8_t index1;
bool error;

void setup() {
  
  Serial.begin(19200); // only for debug the results . 
  Sim800l.begin(); // initializate the library. 
  //Sim800l.reset();
  //don't forget to catch the return of the function delAllSms! 
  //error=Sim800l.delAllSms(); //clean memory of sms;
  gpsSerial.begin(9600);
  Serial.println("setup beendet");
}

void loop() {
  Serial.println("Lese Speicher");
  delay(100);
  textSms=Sim800l.readSms(1); //read the first sms
  while (gpsSerial.available() > 0) {
          gps.encode(gpsSerial.read());
        }
        
  if (textSms.indexOf("OK")!=-1) //first we need to know if the messege is correct. NOT an ERROR
  { 
    Serial.println("Speicher wird verlesen");
    delay(100);
    Serial.println(textSms);  
    Serial.println("Nachricht verlesen");
    if (textSms.indexOf("Test")!=-1){
        Serial.println("bestimme Position");
        if (gps.location.isUpdated()) {
          Serial.print("LAT: ");
          Serial.println(gps.location.lat(), 6);
          Serial.print("LONG: "); 
          Serial.println(gps.location.lng(), 6);
        }
        else {
          Serial.println("Positions nicht gefunden");
        }
    }
    Serial.println("leere Speicher");
    delay(5000);
    //Sim800l.delAllSms(); //do only if the message is not empty,in other case is not necesary
             //delete all sms..so when receive a new sms always will be in first position
  }
  
       
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

aus https://docs.arduino.cc/learn/built-in-libraries/software-serial/

  • It cannot transmit and receive data at the same time.
  • If using multiple software serial ports, only one can receive data at a time.

So geht es: https://docs.arduino.cc/tutorials/communication/TwoPortReceive/

Wenn das mit dem softwareserial auf zwei Geräten nicht klappt, dann geht der hier ohne umschalten:

#include "Sim800L.h"

#include <TinyGPS++.h>

#include <SoftwareSerial.h>

#include <AltSoftSerial.h>  // UNO/NANO PIN 8 RX # PIN 9 TX NOT CHANGE!
constexpr uint8_t SIMRX {8};
constexpr uint8_t SIMTX {9};

Sim800L Sim800l(SIMRX, SIMTX);  //to declare the library


//GPS
constexpr uint8_t GPSRX {6};
constexpr uint8_t GPSTX {5};
constexpr uint16_t GPS_BAUD {9600};
TinyGPSPlus gps;
SoftwareSerial gpsSerial(GPSRX, GPSTX);



//SMS
String textSms, numberSms;
uint8_t index1;
bool error;

void setup()
{
  Serial.begin(19200); // only for debug the results .
  Sim800l.begin(); // initializate the library.
  //Sim800l.reset();
  //don't forget to catch the return of the function delAllSms!
  //error=Sim800l.delAllSms(); //clean memory of sms;
  gpsSerial.begin(GPS_BAUD);
  Serial.println("setup beendet");
}

void loop()
{
  Serial.println("Lese Speicher");
  delay(100);
  textSms = Sim800l.readSms(1); //read the first sms

  while (gpsSerial.available() > 0)
  {
    gps.encode(gpsSerial.read());
  }

  if (textSms.indexOf("OK") != -1) //first we need to know if the messege is correct. NOT an ERROR
  {
    Serial.println("Speicher wird verlesen");
    delay(100);
    Serial.println(textSms);
    Serial.println("Nachricht verlesen");

    if (textSms.indexOf("Test") != -1)
    {
      Serial.println("bestimme Position");

      if (gps.location.isUpdated())
      {
        Serial.print("LAT: ");
        Serial.println(gps.location.lat(), 6);
        Serial.print("LONG: ");
        Serial.println(gps.location.lng(), 6);
      }
      else
      {
        Serial.println("Positions nicht gefunden");
      }
    }

    Serial.println("leere Speicher");
    delay(5000);
    //Sim800l.delAllSms(); //do only if the message is not empty,in other case is not necesary
    //delete all sms..so when receive a new sms always will be in first position
  }
}

Beachte den Kommentar.

Sollte das nicht auf Anhieb klappen, weil die sim800 damit nicht klar kommt, dann tausche die jeweiligen Pins und verwende für die sim800 Softwareserial.

In der Beschreibung des verlinkten Beispielsketches werden der MEGA , Mega2560 und der Leonardo genannt. Es fehlen der UNO bzw NANO. Darum trifft das gesagte meiner Meinung nicht auf den NANO zu. Außerdem braucht es bei der im Beispiel genannten Hardware keine 2 Software serielle Schnittstellen da der MEGA / MEGA2560 3 unbenutzte Hardware-Serielle Schnittstellen hat und der Leonardo eine freie Hardwareschnittstelle hat. Darum ist es nicht notwendig 2 serielle Schnittstellen in Software zu emulieren.

Mein Vorschlag. benutze einen Arduino MEGA2560. Es gibt Nachbauten die mechanisch sehr platzsparend aufgebaut sind.
Grüße Uwe

Ist doch egal, was da fehlt!
Ausschlaggebend ist:

SoftwareSerial library has the following known limitations:

  • It cannot transmit and receive data at the same time.

Du kannst keine zwei Instanzen gleichzeitig betreiben!

Software Serial arbeitet über/mit PCINT.

Darum funktioniert es beim Mega nicht mit allen Pins, beim UNO und Nano allerdings schon.

Naja.... mein Wissen sagt anderes!
Beim UNO und Nano funktioniert Software Serial wie in der Doku beschrieben.

ok.