Schnittstelle auslesen - Infos in Strings schreiben und diese vergleichen

Hallo Forum,

also derzeit arbeite ich an einem Sketch für eine zukünftige Wetterstation, welche Messdaten über das Seeedstudio GPRS Modul mittels SMS verschickt an diverse Teilnehmer.

Das GPRS Modul ist testweise an einem Arduino UNO angeschlossen.

Kommuniziert wird zwschichen GPRS Modul und Arduino über SoftwareSerial und zwischen Arduino und PC über den Hardware UART.

Grundsätzlich funktioniert ja die Kommunikation zwischen Arduino und GPRS Shield.

Beim Hochfahren erhalte ich auch eine schöne Konversation vom GRPS Shield, wo man die AT Kommandos erkennen kann.

<0>ÿÿÿÿÿÿÿÿ
RDY

+CREG: 2

+CREG: 0

+CFUN: 1

+CPIN: SIM PIN
AT+CPIN=xxxx

OK

+PACSP: 1

+CREG: 2

+CREG: 1,"0
Call Ready

Mein Beispielcode erkennt nun wenn eine SMS eintrudelt, denn dann meldet das GPRS Shield über seine SoftwareSerial Schnittstelle folgenden Text an den Hardware UART

+CMTI: "SM",6

Unten in meinem Sketch frage ich dann den eingelesenen String bei Serial.available() mit meinem SMS Empfangshinweis '+CMTI:' ab, und wenn es wirklich so ist, soll die Led 13 leuchten.
Damit sie wieder ausgeht, muss ich absichtlich ein AT Kommande falsch eingeben, sodass am ein 'ERROR' Text ausgegeben wird. ( dass erreche ich mit AT? + Enter drücken am Terminal)
Beides funktioniert super.

Doch ich würde viel lieber einen kompletten String, aus meherer Wörtern bis zum ersten CR einlesen, und in dieser Stringwurst nach diversen Schlüsselwörtern suchen lassen, bzw diese auch anhand von bestimmten Zeichen in Einzelstrings zu zuerlegen.
Doch wie mache ich dass am besten.

Ich bitte euch deshalb um Unterstützung.

char GPRS_read,GPRS_write;
char IncSMS = '+CMTI:';  // Erhält man bei eingehender SMS - 13.Zeichen definiert den SMS Index=> hier vollständige Meldung    +CMTI: "SM",6 
char ATErr = 'ERROR';

void setup() habe ich der Übersicht ausgelassen, dort definiere ich nur die StartUp Procedure vom GPRS Modul.

void loop()
{
  if (GPRS.available())
  {
    GPRS_read = GPRS.read();
    Serial.write(GPRS_read);
    
    if (GPRS_read == IncSMS)
      {
        digitalWrite(13,HIGH);
      } // bei SMS Empfang wird Led eingeschaltet
    
    if (GPRS_read == ATErr) 
      {
        digitalWrite(13,LOW);   // bei erzwungenen ERROR Meldung wird Led ausgeschaltet
      }
    
    
  }
  if (Serial.available())
  {
    GPRS_write = Serial.read();
    GPRS.write(GPRS_write); 
  }   
}

vielen vielen dank mal schon in voraus.

würde ich aber das ganze hier so mit String machen.

void loop()
{
  if (GPRS.available())
  {
    String GPRS_StringRead = String(GPRS.read());
    Serial.print(GPRS_StringRead);

bekomme ich beim compilieren diesen Fehler

error: no matching function for call to 'HardwareSerial::write(String&)'

Ändere ich von Serial.write auf Serial.print(GPRS_StringRead) so erhalte ich das was er einließt leider nicht als ASCII am Terminal Fenster sondern sind einzelne Zahlen....

131043678269715832511310131078798277657632807987698232687987781310

GPRS.read() liefert nur einen Buchstaben, String(GPRS.read()) hilft da auch nicht
( ausser dass man das Ergebnis nicht mehr mit write() ausgeben kann )

ich würde viel lieber einen kompletten String, aus meheren Wörtern bis zum ersten CR einlesen, und in dieser Stringwurst nach diversen Schlüsselwörtern suchen

Nenn das ganze nicht String oder Stringwurst, sondern char buffer[80]

...
static char buffer[80];
static int pos=0; // Die aktuelle Stelle in buffer, die noch frei ist.

if (GPRS.available())
{ 
   buffer[pos] = GPRS.read();
   if (buffer[pos] == '\n')
   { 
        buffer[pos] = 0; // EndeKennung statt NewLine
        // hier buffer fertig zum Verwursten
        Serial.write (buffer); 
        Verwursten(buffer); 
 
       pos=-1; // buffer frei für die näachste Zeile
   }
   
   if (pos < 79) pos++;  // Noch nicht fertig, aber noch Platz in buffer, oder -1 --> 0
}
...

Hallo,

danke für deine Hilfe.
Letztendlich habe ich das so gelöst,eh ziemlich ähnlich zu deinem Code.

#include <SoftwareSerial.h> 

SoftwareSerial GPRS(4, 5);
char buffer[255]; // buffer array for data recieve over serial port
int count=0;     // counter for buffer array

void clearBufferArray(); // initialize function
void setup()
{
  
  delay(10000);

  GPRS.begin(19200);               // the SoftwareSerial baud rate for communication between gprs shield and arduino
  Serial.begin(19200);             // the HardwareSerial baud ratte for communication between arduino and pc or notebook
  pinMode(3, OUTPUT);              // start up procedure for gprs shield to power up
  digitalWrite(3,LOW);
  delay(1000);
  digitalWrite(3,HIGH);
  delay(2500);
  digitalWrite(3,LOW);
  delay(3500);                      // end of start up procedure 
  GPRS.print("AT+CPIN=xxxx\r");     // send AT Command and PinCode over softwareserial from arduino to gprs shield
  pinMode(13,OUTPUT);
  
  digitalWrite(13,HIGH);
  //delay(5000);
}
 
void loop()
{
  if (GPRS.available())              // if date is comming from softwareserial port ==> data is comming from gprs shield
  {
    while(GPRS.available())          // reading data into char array 
    {
      buffer[count++]=GPRS.read();     // writing data into array
    }
    Serial.write(buffer);            // if no data transmission ends, write buffer to hardware serial port
    Serial.print("\r");              // send a CR because it is missing
    count = 0;                       // set counter of while loop to zero
    clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
    
    

  }
  if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
    GPRS.write(Serial.read());       // write it to the GPRS shield
}


void clearBufferArray()              // function to clear buffer array
{
  for (int i=0; i<255;i++)
    { buffer[i]=NULL;}                  // clear all index of array with command NULL
}

Jedoch habe ich noch meine Probleme, wie ich nun aus dem eingelesenen char buffer, einen Vergleich mit einem String anstelle.
Ich möchte gerne wissen,ob im eingelesenen buffer zB ein bestimmtes Schlüsselwort ( zB +CMTI: ) vorkommt oder nicht.
Wenn ja sollen dann halt von mir diverse Operationen kommen.

Wie stelle ich dass am besten bzw einfachsten an?

lg
Dieter

strcmp()

Am einfachsten bei char * tmp = buffer anfangen, solange strcmp ungleich meldet, tmp erhöhen, bis man die effektive Länge das aktuellen Texts erreicht hat.