• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Funkcja zmiany wartości String.
#1
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.
 
Odpowiedź
#2
(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.
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#3
if (numerGlowny == numer1) numerGlowny = numer2;
else numerGlowny = numer1;
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#4
(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.
 
Odpowiedź
#5
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?
 
Odpowiedź
#6
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();                                                                                                                         
    }
   }
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości