Değişkenin içerisinden belli bir bölümü ayrıştırma

Iammy

Üye
Katılım
22 May 2021
Mesajlar
94
Puanları
1
Yaş
20
Arkadaşlar merhaba. Arduino ve gsm sheild ile bir proje yapıyorum yazılım konusunda biraz zayıfım ve bir noktada tıkandım. Kısaca sorunu şöyle özetleyeyim: Biri arduinoya mesaj attığında değişkene şu değer geliyor:

AT+CMGR=1
+CMGR: "REC UNREAD","+9050571xxxxx","","2021/08/26 23:59:44+12"
Selam

Burada telefon numarası ve saat tarih kısmı hariç diğer karakterler sabit. Ben mesajı atan telefon numarasına geri bir cevap göndereceğim bunun için yukarıdaki yazıların içinden telefon numarasını ayrıştırmam lazım bunu nasıl yapabilirim
Şimdiden teşekkürler
 
Gsm shield varsa gsm kitaplığını kullanabilirsin. Tek tek stringi çözmene gerek yok. Aşağıdaki örneği inceleyebilirsin.

https://www.arduino.cc/en/Tutorial/LibraryExamples/GSMExamplesReceiveSMS
Cevabın için teşekkürler ama yazılım bilgim az. Hazır bi proje buldum başka örneklerden lazım olan kısımları kopyalıp kendime göre değişkenleri değiştirip projeyi yapıyorum farklı bir kütüphaneye geçip sıfırdan kod yapabileceğimi sanmıyorum. String çözmek derken nasıl birşey elinizde bir örnek varsa paylaşabilirmişsiniz veya benim yapmak istediğim olayın yazılımcı jargonunda adı nedir ona göre internette araştırabilirdim.
 
Metinde seninde gördüğün gibi değerler "," ile yani virgülle birbirinden ayrılmış durumda. Aşağıdaki kod virgül sayısına göre sana değerler üretir.

C++:
String degerAl(String,uint8_t,uint8_t);

void setup() {
  Serial.begin(115200);
  String metin =R"rawliteral(+CMGR: "REC UNREAD","+9050571xxxxx","","2021/08/26 23:59:44+12","Selam")rawliteral";
  String tel_numarasi = degerAl(metin,1,',');
  String sms_metni = degerAl(metin,4,',');
  Serial.println(tel_numarasi);
  Serial.println(sms_metni);
}

void loop() {
 
}

String degerAl(String yazi,uint8_t index,uint8_t karakter){
    uint8_t found = 0;
    int strIndex[] = {0, -1};
    uint8_t maxIndex = yazi.length()-1;

    for(uint8_t i=0; i<=maxIndex && found<=index; i++){
        if(yazi.charAt(i)==karakter || i==maxIndex){
            found++;
            strIndex[0] = strIndex[1]+1;
            strIndex[1] = (i == maxIndex) ? i+1 : i;
        }
    }

    return found>index ? yazi.substring(strIndex[0], strIndex[1]) : "";
}

çalıştırdığın zaman aşağıdaki çıkışı verir.

Kod:
"+9050571xxxxx"
"Selam"
 
Son düzenleme:
Metinde seninde gördüğün gibi değerler "," ile yani virgülle birbirinden ayrılmış durumda. Aşağıdaki kod virgül sayısına göre sana değerler üretir.

C++:
String degerAl(String,uint8_t,uint8_t);

void setup() {
  Serial.begin(115200);
  String metin =R"rawliteral(+CMGR: "REC UNREAD","+9050571xxxxx","","2021/08/26 23:59:44+12","Selam")rawliteral";
  String tel_numarasi = degerAl(metin,1,',');
  String sms_metni = degerAl(metin,4,',');
  Serial.println(tel_numarasi);
  Serial.println(sms_metni);
}

void loop() {
 
}

String degerAl(String yazi,uint8_t index,uint8_t karakter){
    uint8_t found = 0;
    int strIndex[] = {0, -1};
    uint8_t maxIndex = yazi.length()-1;

    for(uint8_t i=0; i<=maxIndex && found<=index; i++){
        if(yazi.charAt(i)==karakter || i==maxIndex){
            found++;
            strIndex[0] = strIndex[1]+1;
            strIndex[1] = (i == maxIndex) ? i+1 : i;
        }
    }

    return found>index ? yazi.substring(strIndex[0], strIndex[1]) : "";
}

çalıştırdığın zaman aşağıdaki çıkışı verir.

Kod:
"+9050571xxxxx"
"Selam"
çok teşekkürler koduma uyarladım. ama küçük bir sorunum var. Sms gönderme komutu şu şekilde:
node.sendSMS(*************, &SMS_text[0]);
Normalde baştaki **** kısma numara yazıyorduk. Ben onun yerine tel numarasi yazdım fakat kod sadece const char* formatında birşey yazılabilir diye hata veriyor. bu telnumarasi değişkenini nasıl const char* formatına çevirebilirim
 
C++:
const char *char_tel_no = string_tel_no.c_str();

ayrıca dizileri argüman verirken
C++:
&SMS_text[0]

şeklinde ilk dizi elemanının adresini vermene gerek yoktur. Dizi ismi zaten ilk elemanın adresini belirtir yani
C++:
node.sendSMS(*************, SMS_text);

olarak yazabilirsin.
 
Son düzenleme:
C++:
const char *char_tel_no = string_tel_no.c_str();
kodu yazdım fakat şu şekilde bir hata aldım
C++:
 const char *char_numara = string_numara.c_str()
                                   ^~~~~~~~~~~~~
                                   char_numara
exit status 1
'string_numara' was not declared in this scope
acaba sizin dediğiniz kodu yanlış yere mi yazdım tam olarak önceki verdiğiniz kodun hemen altına eklemiştim.
Birde benim değişkenim "numara"
 
kardeş okuduğun telefon numarasını nasıl kaydettin oraya kaydettiğin stringi yazacaksın. string_numara diye bir değişken yok diyor. Eğer benim yazdığımın altına eklediysen

CoffeeScript:
const char *char_tel_no = tel_numarasi.c_str();

yazman gerekir.
 
kardeş okuduğun telefon numarasını nasıl kaydettin oraya kaydettiğin stringi yazacaksın. string_numara diye bir değişken yok diyor. Eğer benim yazdığımın altına eklediysen

CoffeeScript:
const char *char_tel_no = tel_numarasi.c_str();

yazman gerekir.
Tamam hocam hallettim kusura bakmayın sizi de uğraştırdım
 

Forum istatistikleri

Konular
128,129
Mesajlar
915,277
Kullanıcılar
449,846
Son üye
g-silver

Yeni konular

Geri
Üst