Forum: Mikrocontroller und Digitale Elektronik Einmaliges Reagieren auf gleiche, sich mehrfach wiederholende Zustände


von Gustav (Gast)


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

von U.R. Schmitt (Gast)


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.

von chrizz (Gast)


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

von Gustav (Gast)


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

von Toni (Gast)


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.

von Tüll (Gast)


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

von Jörg H. (idc-dragon)


Lesenswert?

Binäroperationen könnten dein Freund sein. Ein XOR ("^" in C) meldet 
Veränderungen, mit AND ("&" in C) kann man das mit Bitmasken 
vergleichen.

Jörg

von Gustav (Gast)


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;
}

von Gustav (Gast)


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.

von Karl H. (kbuchegg)


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;

von Gustav (Gast)


Angehängte Dateien:

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

von Marcel (Gast)


Lesenswert?

Wenn ich das jetzt richtig verstanden habe, willst du nach dem Versenden 
der Nachricht warten, bis die beobachteten Zustände wieder Null sind. 
Dann soll dein Prog. wieder sendebereit sein.

von Gustav (Gast)


Lesenswert?

Hallo Marcel,
richtig. Allerdings schlag ich mich immer noch damit herum, das nach dem 
erstmaligen detektieren das Programm wartet, bis der String wieder Null 
ist und ich komm nicht drauf.VG

von Marcel (Gast)


Lesenswert?

hmmm, soweit ich das beurteilen kann passt das soweit...

von Gustav (Gast)


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.

von Reiner (Gast)


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ß

von Gustav (Gast)


Lesenswert?

Hallo Reiner,
vielen Dank für deine Hilfe!
VG,
Gustav

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.