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; } 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 :slight_smile: Saygılar..

Sizi belirtmeyi unutmuşum kusura bakmayin:)