GSM modül ve Arduino haberleşmesindeki problem
  • Merhaba arkadaşlar, bir konuda yardımlarınıza ihtiyaç duymaktayım. Arduino üzerinde AT komutları ile GSM modülümü programlıyorum. Yaptığım programda sıkıntı çıkmadı. Ta ki bir gün kod sayfamı revize etmek istedikten sonra gelen mesajları almada problem yaşıyorum. Gelen mesajın text kısmında karakterleri kaçırmaya başladı. eğer mesaj tek kelime ise (Örn merhaba) herhangi bir sıkıntı çıkmıyor fakat uzunsa (örneğin this is a trial message) sonlara doğru karakterleri kaçırıyor.(this is a trial me'ye kadar anlamlı alıyor sonrası yok). Bir diğer sıkıntı gsm modülden herhangi bir mesajı almak istediğimde mesajın text kısmının başına anlamsız karakterler koyuyor. Koyduğu karakterin ASCII değerini öğrenmek istediğimde "-91,-92,-93" gibi ifadeler görüyorum. İf’i kaldırıp sadece while döngüsü koydum, araya “\n” koydum gene değişmedi. Kısacası bir çok noktayı denedim ama olmadı. Gözden kaçırdığım bir nokta var ama bulamadım. Farklı bakış açısı için sizlerin yardımlarınızı talep etmekteyim. Aşağıdaki kodda nerede hata yapıyorum. Kendimi denizi geçip derede boğuluyormuş gibi hissediyorum.

    #include < SoftwareSerial.h>

    SoftwareSerial gsmmodul(10, 11); // GSM Modül için RX, TX

    String text;// GSM den gelen veriyi tutan string
    String gelen_mesaj,kontrol_numara;
    char m;
    int i,ilk_isaret,ikinci_isaret;
    void setup()
    {

    Serial.begin(9600);
    gsmmodul.begin(9600);

    while (!gsmmodul)
    {
    ; // bağlantı sağlanana kadar bekle
    }



    void loop()
    {

    if (gsmmodul.available())
    {
    text="";

    do
    {
    m= gsmmodul.read(); //gsmmodul’den okuduğu karakterleri m değişkenine ata
    text+=m;
    delay(4); //4 ms bekle

    }while(gsmmodul.available());

    ilk_isaret = text.indexOf('"');
    for(i=0;i<7;i++)<br /> {
    ikinci_isaret = text.indexOf('"', ilk_isaret + 1 );
    if(i==2)// Burada mesajın atan numara alınıyor
    {
    kontrol_numara = text.substring(ilk_isaret + 3, ikinci_isaret);
    Serial.print("Mesaj atan numara: ");
    Serial.println(kontrol_numara);
    }
    else if(i==6) // Burada mesajın içerisindeki text alınıyor
    {
    gelen_mesaj=text.substring(ikinci_isaret + 1);
    Serial.print("Coming message: ");
    Serial.println(gelen_mesaj);

    }
    ilk_isaret=ikinci_isaret;
    }
    }
    else if (Serial.available())
    {

    do
    {
    m= Serial.read(); //serial’den okuduğu karakterleri m değişkenine ata
    text+=m;
    delay(10); //200 ms bekle

    }while(Serial.available());
    gsmmodul.println(text);
    text="";

    }

    }
  • Merhaba,
    sorunun çözümü için detaylı incelemek gerek.
    Fakat ben kendi mesaj alma kodumdan örnek vereyim kodunu ona göre çevir.

    Buffer yettiğince istediğin mesajı kaçırmadan alabilirsin böylelikle.
    bir adet gelen byte ları almak için değişken ,bir adet gelen byteları biriktirmek için dizi, bir adet de gelen byte ları saymak için sayıcı tanımlamak gerek.

    char gelenbit;
    char gelenveri[250];
    int bitsayici;

    while(gsmmodul.available() > 0) // eger modülden gelen bir veri varsa
    {
    gelenbit = gsmmodul.read(); //gelen bytı bir degiskene ata
    gelenveri[bitsayici] = gelenbit; //gelen her degiskeni bir dizide biriktir

    if (gelenbit == '\n') // gsm modüllerde satır sonu olarak \n gelir bunu kontrol et
    {
    //buraya girdiğinde artık sana modülden bir veri satırı gelmiş demek, bu satırın senin istediğin satır olup olmadığını kontrol etmen gerek

    bitsayici = 0; // satır sonu geldiği için artık bir sonraki mesajın dizinin başından yazılmaya başlaması için sıfırlıyoruz


    for (int j = 0; j <= 250; j++) gelenveri[j] = 0;// gelen veri dizisini sıfırlıyarak yeni bir dizi beklemeye başlıyoruz<br /> }
    else bitsayici++; // eğer satır sonu mesajı gelmemişse gelecek olan yeni byte ı dizide bir sonraki yere yazmak için değeri 1 arttırıyoruz.
    }


    bu kodla gelen her mesajı eksiksiz yakalayabilirsin. bu bir örnek kendi koduna entegre edebilirsin

  • hocam senin dediğin gibi de denedim. Gelen karakterleri ekrana yazırdığımda bir sürü anlamsız karakter çıktı ortaya. Ben senin dediğin koda ilave olarak array'i stringe atayıp string'i ekrana yazdırdım. acaba bundan dolayı olabilir mi? yoksa başka bir problem mi var. İlave olarak araya 4 ms delay koymazsam bir sürü karakteri kaçırıyor. o olmadan olmuyor.böyle yapmam doğru mudur?
  • anlamsız karakter deyince aklıma baudrade geliyor. modülün baudratesi ne olursa olsun sen arduinodan 9600 ü dene.
    bunu anlamak için ekrana hem arrayı yazdır hem stringi bak bakalım aynımı

    delayı data alma aşamasında değilde komuttan komuta geçerken kullan.
  • hocam tekrardan merhabalar, problemimi çözdüm fakat bir şey ile karşılaştım. Bunu paylaşmam faydalı olacaktır diye düşündüm. Aslında bu durum benden mi kaynaklı yoksa genel bir sıkıntı mı anlamadım.

    Toparlamak gerekirse karşılaştığım garip durum şu:
    Eğer gsm modelüme ios işletim sistemi kullanan bir telefondan mesaj atarsam ve gelen mesajı arduino ile okuyup ekrana bastığımda mesajın bilgi kısmından sonraki kısım olan text kısmın başına 4 tane küçük kare sembolü oluyor. Fakat android işletim sistemi kullanan bir telefondan mesaj atılırsa bu durum ile karşılaşılmıyor. Aylarca bununla uğraşmıştım neden bu küçük kare sembolü çıkıyor diye. Tesadüfen teste başka bir telefon kullanınca ortaya çıkardım. Başından beri bununla uğraşıyordum ve kurcaladıkça sonuç dahada kötüleşti. sonrasında araya ilave kod koyarak bu anlamsız karakteri atıyorum ama bu durum beni şaşırttı ve çözemedim.

    Bu durum ile karşılaşan var mı? genel mi yoksa özel bir problem mi bu ? çözümünü bilen var mı?

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.