Arduino Polska Forum
Funkcja zmiany wartości String. - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: Funkcja zmiany wartości String. (/watek-funkcja-zmiany-warto%C5%9Bci-string)



Funkcja zmiany wartości String. - pawel296 - 17-04-2020

Siedzę nad tym 2 dni, ale nie mogę tego rozgryźć. Mam trzy zmienne String numerGlowny; String numer1 = 111111111;  String numer2 = 222222222 są to numery telefonów i taką funckcję:


Kod:
if((textMessage.indexOf(F("NO DIALTONE"))>=0) || (textMessage.indexOf(F("NO CARRIER"))>=0) || (textMessage.indexOf(F("BUSY"))>=0) || (textMessage.indexOf(F("NO ANSWER"))>=0)){
     numerGlowny = numer2;
     telefon();
      }





Kod:
void telefon(){
  altSerial.println("ATD+48"+numerGlowny+";");
  delay(100);
}


Chcę aby po każdorazowym zrealizowaniu warunku w ifie, numerGlowny zmieniał się naprzemiennie, czyli po odczytaniu "NO DIALTONE" numerGłówny ma wartość "1111111111". Po kolejnym odczytaniu "NO DIALTONE" wartość ta zmienia się na "222222222", Po kolejnym odczytaniu "NO DIALTONE" zmienia się na "111111111" i tak w kółko.
Jak to zrobić? Bo mi już czacha dymi od myślenia.


RE: Funkcja zmiany wartości String. - ANT - 17-04-2020

(17-04-2020, 17:32)pawel296 napisał(a):
Kod:
void telefon(){
  altSerial.println("ATD+48"+numerGlowny+";");
  delay(100);
}

1. Czy numerGlowny podstawiasz w postaci Stringa?

2. Spróbuj również "ATD+48"+numerGlowny+";" zapisać to w jednej zmiennej String
 
i dopiero podstawić tą zmienną w funkcji altSerial.println(zmienna String);


Pzdr.


RE: Funkcja zmiany wartości String. - Robson Kerman - 17-04-2020

if (numerGlowny == numer1) numerGlowny = numer2;
else numerGlowny = numer1;


RE: Funkcja zmiany wartości String. - pawel296 - 18-04-2020

(17-04-2020, 23:31)Robson Kerman napisał(a): if (numerGlowny == numer1) numerGlowny = numer2;
else numerGlowny = numer1;

O to chodziło. Nie wiem jak na to mogłem nie wpaść. Dzięki Robson.


RE: Funkcja zmiany wartości String. - pawel296 - 19-04-2020

Nie będę zakładał nowego teamtu, tylko napisze w tym samym bo i tak związanej jest to z jednym projektem.

Mam coś takiego:

Kod:
if((textMessage.indexOf("NO CARRIER")>=0) || (textMessage.indexOf(F("NO DIALTONE"))>=0) || (textMessage.indexOf(F("BUSY"))>=0) || (textMessage.indexOf(F("NO ANSWER"))>=0)){
      if(numerGlowny == numer1){
        numerGlowny = numer2;
      }else{
        numerGlowny = numer1;   
      }
      telefAlarm();
      textMessage="";
      rozlaczanieAlarm.time(STOP);                                                           
    }


W celu ponownego połączenia gdy, poprzedniego połączenia nikt nie odebrał dorzuciłem  do środka ifa  (textMessage.indexOf(F("NO CARRIER"))>=0). Działa to aż za dobrze, tzn. po odebraniu i rozłączeniu połączenia pojawia się odpowiedź "NO CARRIER" po której odczytaniu następuje wykonanie kolejnego połączenia (na inny numer niż poprzednio).

Chciałem temu zaradzić.


Kod:
17:46:48.062 -> ATD+48519xxxxxx;
17:47:38.679 -> NO CARRIER

Na porcie szeregowym najpierw pojawia się "ATD+48519xxxxxx;"
następnie gdy nikt nie odbierze, pojawia się "NO CARRIER"

Dlatego napisałem takie coś:

i
Kod:
if(textMessage.indexOf("ATD")>=0) {                                                      
       Serial.print(F("textmessage:   "));
       Serial.print(textMessage);
       if(textMessage.indexOf("NO CARRIER")>=0){                                          
         if(numerGlowny == numer1){
           numerGlowny = numer2;
           }else{
           numerGlowny = numer1;   
          }
      telefAlarm();                                                                           
      textMessage="";                                                                         
      rozlaczanieAlarm.time(STOP);                                                            
     }
    }

Niestety to nie działa. Pytanie dlaczego? W analogiczny sposób zrobiłem rozłączanie. Po odebraniu połączenia uruchamia się timer, który odlicza czas do polecenia ATH.


Kod:
if(textMessage.indexOf("+COLP:")>=0){                                                   
      delay(100);
        if(textMessage.indexOf(F("OK"))>=0){
          Serial.print(F("uruchomiono timer rozlaczanie"));
          rozlaczanieAlarm.begin(rozlaczanieAlarmOdliczanie * 1000);
          rozlaczanie = 0;                                                                   
          textMessage = "";
        }
      }


kopia z portu:

Kod:
17:50:49.423 -> ATD+48519xxxxxx;
17:51:13.838 -> +COLP: "48519xxxxxx",145,"",0,""
17:51:13.838 ->
17:51:13.838 -> OK
17:51:13.973 -> uruchomiono timer rozlaczanieATH
17:51:35.087 -> OK


W głównej pętli mam takie coś :


Kod:
char c;
  while (Serial.available()) {                                         
    c = Serial.read();
    altSerial.write(c);
  }     

  while (altSerial.available()) {                                       
    c = altSerial.read();
    textMessage = altSerial.readString(); 
    Serial.print(c);
    Serial.print(textMessage); 
  }

Jak  ogarnąć to aby rozróżnić "NO CARRIER" po odebraniu i rozłączeniu, od  "NO CARRIER" po nieodebraniu połączenia?


RE: Funkcja zmiany wartości String. - pawel296 - 20-04-2020

Olśniło mnie, rozwiązanie może brzydkie, ale działa


Kod:
if(textMessage.indexOf("TD")>=0 && textMessage.indexOf(numer1)>=0){ATD = "abcd"; }     
if(textMessage.indexOf("TD")>=0 && textMessage.indexOf(numer2)>=0){ATD = "abcd"; }     
    if(ATD == "abcd"){                                                                                                      
      if(textMessage.indexOf("NO CARRIER")>=0){                                                                                   
        if(numerGlowny == numer1){
          numerGlowny = numer2;
          }else{
          numerGlowny = numer1;   
          }
          ATD = "";
          textMessage = "";
          telefAlarm();                                                                                                                         
    }
   }