Arduino Polska Forum

Pełna wersja: Funkcja zmiany wartości String.
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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.
(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.
if (numerGlowny == numer1) numerGlowny = numer2;
else numerGlowny = numer1;
(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.
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?
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();                                                                                                                         
    }
   }