At komutlarinin cevabı hk.[çözüldü]
  • Merhabalar,
    Bağlantı hızı 9600 olan gsm modulu için bir fonksiyon yazdim.
    Bu fonksiyon icinde At komutlarını gönderip ve aynı fonksiyon icinde cevaplarını almak istiyorum ama dönen cevapları eksik yakalıyorum,bu da mikrokontrollarin hızından kaynaklandığını dusunuyorum.Böyle bir bağlantı hızında mikrokontrolari ne kadar yavaşlatmam gerekir(veya cevabin tumu gonderildikten sonra mesaj bitti diye bir sinyal gönderiliyor mu) ve tabi yavaslatirkende tamponun dolma durumu olabilir.Nasıl bir yol izlemeliyim.Arduinonun GSM kütüphanesinin inceledim onunda bir yerden sonra ipin ucu kaçıyor, sakın kafayla bugün yine bakaçağım:)
    Saygilarimla
  • yavaşlamayacaksın daha hızlı olup gelen her karakteri eksiksiz yakalaman lazım. aralarda bekleme filan varsa kaldır. once komutu yolla ve hiç beklemeden gelen karakterleri yakala belirli bir dönüş kelimesi beklemek yerine bır zaman aşımı koy mesela 100ms ıcınde bır şey gelmezse o zaman gelen tamponu ıncele.

    modem genelde yolladığın komutu sana geri gonderir yani echo yapar default seçenekte bunu da kaldır boşuna tamponunu doldurma.

    mesela ATcrlf yolladın sana
    ATcrlf

    OKcrlf

    yollar
    echo yu kestinmi sadece
    OKcrlf yollar
  • echo olayını bilmiyordum hocam:), sayenizde bir şey daha öğrenmiş oldum.Deneyip sonucu yazacağım.
  • seri iletişim protokollerinde cevap mesajı ne olursa olsun sonlandırma karakteri vardır.
    genelde #13 #10 veya her ikisidir. Serial.readBytesUntil için bir inceleme yap istersen..
  • bu yontem olur ama eger karakter kaçırmışsa okuma rutinin buna ek olarak tımeout da oluştur.
  • while(!Serial1);
    while(Serial.available()){
    char c = Serial1.read();
    Serial.write(c);
    }
    bu şekilde olduğunda mantıken hiç birşeyin kaçmaması gerekiyor ama kaçırıyor, delay(1) eklediğimde kaçırma olayı neredeyse olmuyor ama neredeyse olayının olmaması gerekiyor.

    Ayrıca;

    aşağıda yazmış olduğum kod ve çıktısı aşağıda(gsm echo modunda),neden gelen bir veri yokken(veya geliyor anlamlı değil,onu anlamlı hale getirebilir miyim) if e giriyor.i degişkenini kaç defa if e girdiğini görmek için tanımladım.Biraz fazla giriyor:)

    void loop() {
    if (Serial1.available()) {
    Serial.write(byte(Serial1.read()));
    i++;
    Serial.println(i);
    }
    if (Serial.available()) {
    Serial1.write(Serial.read());
    }
    }

    Kodun çıktısı:

    a1
    t2
    3

    4
    5

    6
    O7
    K8
    9

    10
  • buradaki mevzu basit.

    1) serial available kısmını if ile yapmışsın.
    Bunu while türüne çevir.
    Bunun sebebi eğer gelen bir blok var ise, while hepsini alana kadar aynı yerde döner böylece data tam ve eksiksiz alınır.
    if ise 1 datayı alır sonra aşağıda kalan kod kısımlarını işler ve tekrar yukarıdan döner.Bu sürede data kaçırma olasılığın yüksek.


    2) gsm modüller her mesajından sonra \n gönderir o yüzden sen her gelen karakteri \n mı yoksa değilmi diye kontrol et.Benim yapım şu şekilde

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


    while(seriportkontrol = mySerial.available() >0)
    {
    gelenbit=mySerial.read();
    gelenveri[bitsayici] = gelenbit;

    if(gelenbit == '\n')
    {
    bitsayici=0;
    //burada anla ki tam bir cümle alabildin datan artık gelenveri isimli bufferda içerisinde kayıtlı.
    //gelen data ile işlemlerini hallet çarp biç böl topla işin bitince
    //gelenveri adlı buffer ı temizle
    for (int j = 0; j <= 250; j++) gelenveri[j] = 0;<br />}
    else bitsayici++;
    }

    bu şekilde her gelen biti bir buffera yazarsın ve her gelen bitte sonlandırma bitim geldimi diye kontrol edersin.
    Sonlandırma biti gelincede elindeki veri ile istediğini yaparsın
  • Teşekkür ederim,
    Bir önceki yazımın başındaki while ile yapmış olduğum bir örneği koydum ama yinede kaçırıyor.Sizin vermiş olduğunuz örnekte seriportkontrol değişkeni ne yapmakta acaba atama yapmışsınız ondan sonra başka bir yerde kullanmamışsınız.
  • karakter kaçırması olayı diğer kodların yoğunluğu sanırım..
    bide interrupt deneyebilirmisin belki çözer diye düşünüyorum.
    https://www.arduino.cc/en/Tutorial/SerialEvent
    sonuçları paylaşalım lütfen ilginç ve hatta başbelası bazı durumların çözümü olabilir..
    saygılarımla
  • at cevapları \n ile bitiyormuş.Sayin Ekmekci ve msg'nin dediği gibi \n ler çözdü olayı, yardımlarınız için çok teşekkür ederim.
  • \n >> #10
    \r >> #13
    :)
    Saygılar..
  • Sizi belirtmeyi unutmuşum kusura bakmayin:)

Howdy, Stranger!

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

Login with Facebook

Tagged

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