Einmaliges Reagieren auf gleiche, sich mehrfach wiederholende Zustände

Gast #2114389
Lesenswert?

Hallo,
durch die Überprüfung serieller Daten möchte ich gerne Befehle via SMS 
versenden. Sprich treten bestimmte Zeichenkombinationen in den zu 
untersuchenden Daten auf, soll eine Nachricht versendet werden.

Diese Zeichenkombinationen können mehrmals nacheinander vorkommen. 
Allerdings will ich, dass dabei nur eine Nachricht versand wird und 
nicht bei jedem Auftreten der Zeichenkombination. Ich hab mir gedacht, 
das nach dem Versenden der Nachricht solange gewartet werden soll, bis 
an den zu untersuchenden Stellen Null sind. Wenn ich die Zeichen 
detektiere, springe ich in…

if( sending_sms == 1 )
  {
    send("DANGER ALARM:");
    sending_sms = 0;
  }

Wenn allerdings die gleichen Zeichen mehrmals nacheinander auftreten, 
versende ich jedes Mal eine SMS. Mit welchem Mech. kann ich das 
vermeiden?
Wäre nett, wenn mir hier jemand weiterhelfen könnte.

VG,
Gustav
Gast #2114408
Lesenswert?

Ich bin mir nicht sicher ob ich dein Problem verstehe? Warum durchsuchst 
du nicht einfach alle Daten und merkst dir ob deine Schlüsselbegriffe 
vorgekommen sind. Erst am Ende entscheidest du dann welche SMS du senden 
musst.
Ansonsten konkretes Beispiel der Daten mit Beschreibung was genau 
passieren soll.
Gast #2114428
Lesenswert?

die gleiche Grundidee wie mein Vorposter, nur anders umgesetzt:
nach dem Senden der SMS Flag setzten und erst wieder löschen, wenn der 
gesamte Suchvorgang beendet wurde.

Kurz:
erst  "sending_sms = 0;"
ausführen, nachdem alles durchsucht wurde.

gruß
Chrizz
Gast #2114431
Lesenswert?

Hallo,

wenn keine Alarmmeldung vorliegt, besteht der zu untersuchende Bereich 
aus Nullen.

"0000000000"

Dieser Teilstring repräsentiert eine Reihe an Alarmmeldungen. Ich 
untersuche diesen String auf diese möglichen Alarmmeldungen.

"1000000000" heißt bspw. Batterie schwach.
"3000000000" heißt Batterie Schwach und geringe Geschwindigkeit.
"5000000000" heißt Batterie schwach, geringe Geschwindigkeit und das 
Gerät
läuft im Backup-Modus. usw.

Die jeweiligen Kombinationen habe ich herausgefunden. Ich möchte nun 
eine Nachricht versenden, wenn die Batterie schwach ist.
Detektiere ich bspw.

"1000000000" so soll eine Nachricht versand werden. Allerdings kann 
anschließend

"3000000000"
"5000000000"
.
.
.
detektiert werden, die ebenfalls "Batterie schwach" beinhalten.
Auf der anderen Seite kann aber bspw. auch erst
"5000000000", dann "1000000000", "3000000000", usw. auftreten.

Erst wenn der String wieder Null ist, also "0000000000" soll es möglich 
sein, beim Auftreten einer neuen Alarmmeldung, eine SMS zu versenden

Meine Frage ist nun, wie kann ich das softwaretechnisch am besten 
realisieren. VG
Gast #2114446
Lesenswert?

Wie schon die Vorposter schrieben:

Alarm-Meldung wird erkannt, SMS senden und ein
Flag setzen.
Solange Flag gesetzt keine weitere SMS senden,
auch wenn Alarm-Meldung erkannt wird.

Werden die 0-en erkannt Flag rücksetzen
und gut ist.
Gast #2114468
Lesenswert?

Wenn ich das richtig verstanden habe:

- Erst mal garnichts senden, sondern alle Meldungen lesen

- Für erste Meldung ein Flage setzen (alarm_sms = 1, wobei 1 hier der 
prioritätsstufe entspricht)

- Wenn eine neue Meldung mit niedriger oder gleicher Priorität gefunden 
wird, ignorieren

- Wenn eine neue Meldung mit höherer Priorität gefunden wird, alarm_sms 
= neue Stufe

- Am Ende (wenn 000000 eingelesen) die SMS mit der Meldung entsprechend 
Flag schicken
Gast #2114561
Lesenswert?

Hallo,
danke für die Antworten.
Also verkürzt ausgedrückt, meint ihr das so, oder? VG


if(sms_send == 0)
{
    if( (data[0] == '1') ||
        (data[0] == '3') ||
        (data[0] == '5') )
    {
        send_sms("Low Battery");
        sms_send = 1;
    }

    if( (data[1] == '1') ||
        (data[1] == 'B') ||
        (data[1] == '4') )
    {
        send_sms("Time Base Fault");
        sms_send = 2;
    }
}

if(sms_send == 1)
{
  if(data[0] == '0');
  sms_send = 0;
}

if(sms_send == 2)
{
  if(data[1] == '0');
  sms_send = 0;
}
Gast #2114797
Lesenswert?

Hi zusammen,
also ich habs jetzt mal nach dem oben beschrieben Ansatz probiert. 
Allerdings klappts immer noch nicht richtig...Kann mir vielleicht jemand 
ein Tipp geben, was ich falsch mache?Bin für jeden Hinweis dankbar.
#2114850
Lesenswert?

Gustav schrieb:
> Hi zusammen,
> also ich habs jetzt mal nach dem oben beschrieben Ansatz probiert.
> Allerdings klappts immer noch nicht richtig...Kann mir vielleicht jemand
> ein Tipp geben, was ich falsch mache?Bin für jeden Hinweis dankbar.

Du brauchst für JEDE Alarmmeldung ein Flag, welches dir sagt, ob die 
entsprechende Alarmierung schon verschickt wurde oder nicht

Und du löscht sie, wenn die entsprechende Alarmierung in deiner 
Nachricht nicht mehr vorkommt
1
    if( (data[0] == '1') ||
2
        (data[0] == '3') ||
3
        (data[0] == '5') )
4
    {
5
      if( !BatteryLowSent )
6
      {
7
        send_sms("Low Battery");
8
        BatteryLowSent = 1;
9
      }
10
    }
11
    else
12
      BatteryLowSent = 0;
13

14

15
    if( (data[1] == '1') ||
16
        (data[1] == 'B') ||
17
        (data[1] == '4') )
18
    {
19
      if( !TimeBaseFaultSent )
20
      {
21
        send_sms("Time Base Fault");
22
        TimeBaseFaultSent = 1;
23
      }
24
    }
25
    else
26
      TimeBaseFaultSent = 0;
Gast #2115409
Lesenswert?

Sorry das ich euch nochmal mit meinen Anfängerproblemen nerve.

Ich habe mal den Ausschnitt angefügt der immer noch nicht richtig will. 
Wenn die beiden Stellen wieder Null sind, bzw. die Alarmmeldungen 
verschwunden sind,, soll es wieder möglich sein eine Nachricht zu 
verschicken. Ich werde noch verrückt... VG
Angehängte Dateien:
Gast #2115595
Lesenswert?

ich komme nicht vorwärts...ich glaube das Problem liegt hier:


    if( ( alarm_data[0] == '2' ) ||
        ( alarm_data[0] == '6' ) ||
  ( alarm_data[0] == 'A' ) )

   {
        send_sms("Low Battery");
        low_battery_sent = 1;

         if(low_battery_sent == 1)
         {

           if( ( alarm_data[0] == '0' ) &&
               ( alarm_data[0] == '0' ) &&
         ( alarm_data[0] == '0' ))

               low_battery_sent = 0;
          }
   }


Wenn ich jetzt nur mal den Zustand low battery betrachte und nur einmal 
das Senden der Nachricht "Low Battery" realiseren will, bis die Zustände 
wieder Null sind... wie muss ich das genau machen. ich hänge total in 
der Luft.
Gast #2115840
Lesenswert?

Das so nicht funktionieren.
    if( ( alarm_data[0] == '2' ) ||
        ( alarm_data[0] == '6' ) ||
        ( alarm_data[0] == 'A' ) )
                                       <- Hier fehlt die Abfrage ob
                                          SMS gesendet
   {
        send_sms("Low Battery");
        low_battery_sent = 1;

         if(low_battery_sent == 1)    <- Dieses IF muss außerhalb stehen
         {

           if( ( alarm_data[0] == '0' ) && <- Dreimal das selbe ?
               ( alarm_data[0] == '0' ) &&
         ( alarm_data[0] == '0' ))

               low_battery_sent = 0;
          }
   }


So sollte es gehen.
Wichtig Klammer um die Oder Bedingung

  if( (alarm_data[0] == '2' ||
           alarm_data[0] == '6' ||
       alarm_data[0] == 'A') &&
       !low_battery_send )
   {
        send_sms("Low Battery");
        low_battery_send = 1;

  }

  if(low_battery_send)
  {
      if( alarm_data[0] == '0' )
        low_battery_send = 0;
   }

Viel Spaß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren