Soru & Cevap

ardunio seri port ekranı hakkında

31.03.2019 - 06:32

Merhaba,

ardunio motor shield ile denemeler yapıyorum, aşağıda kodlarını paylaştığım denemeyi çalıştırdığımda ve seri porta herhangi bir seyler yazdığımda motor çalışıyor ancak 2 kere döngüye giriyor sebebi ise port ekranına yazdığım her sayıdan sonra 0 olarak porta otomatik giriş olması ve if (Serial.available()) { kodunun tekrar çalışması (ekran alıntısını da paylaşıyorum)

 

#include <AFMotor.h>
AF_DCMotor motor_eksen_x(3); 

void setup() {

motor_eksen_x.setSpeed(500); 
motor_eksen_x.run(RELEASE);
Serial.begin(9600);
Serial.setTimeout(10);
Serial.println("Deneme!");
}

void loop() {  
  calistir();
}    

void calistir() {
if (Serial.available()) {
      if (Serial.available() == 0) 
      {
      motor_eksen_x.run(RELEASE);
      }
      else 
      {
         int ch=0;
         ch = Serial.parseInt();
         Serial.println(ch);  
      gitgel();
      } 
    }
 
}      
void gitgel() {  
      motor_eksen_x.run(BACKWARD);  
      delay(700); //Bekleme
      motor_eksen_x.run(FORWARD); 
      delay(700);
      motor_eksen_x.run(RELEASE);
      delay(2000);
}

256 Görüntülenme

4 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user emreaksell
emreaksell
04.04.2019 - 01:12

çok teşekkür ederim Turgut Bey

picture-158072-1530701953.jpg
TGUNEYSU
03.04.2019 - 11:32

Yolladığız kodda yaptığınız değişiklik @ satır:39     Serial.println(ch-48, DEC);  bu -38 'e sebep oluyor. ch değişkeni girilen karakterlerin ASCII kodunu tutuyor. Siz bundan 48 çıkarınca eğer YENI SATIR (ASCII 10) gelmişse elinizde -38 oluyor. Unuttuğunuz nokta sizin girdiniz arkasına Seri Monitörün (SM) eklediği kontrol karakterleri. Örneğin:  SM ayarı Newline - YENİ SATIRsa ve 1 girerseniz, kodunuza 4910 dizisi gelecektir - yani ASCII 49=1 ve ASCII 10=LF(yeni satır kontrol karakteri). SM ayarı Both NL & CR (hem Yeni Satır hem de Satır Başı) ise ve 2 girerseniz, kodunuza 501310 dizisi gelecektir - yani ASCII 50=2 ve ASCII 13-CR (Satır başı) ve ASCII 10=LF(yeni satır kontrol karakteri).            Eğer girdi numaralarınızdan başka birşey gelsin istemiyorsanız, o zaman SM ayarını NO LINE ENDING (satır sonu yok) diye ayarlayın; açılan ufak menünün ilk seçeneği. Bu ayardan sonra yalnız 1-49, 2-50 vs olacaktır. İyi çalışmalar.

 

Profile picture for user emreaksell
emreaksell
03.04.2019 - 10:37

ek kod satırları

https://1drv.ms/t/s!Akh9W6XriP-wl3KIIe2cHnDl4KyS

picture-158072-1530701953.jpg
TGUNEYSU
02.04.2019 - 09:32

Emre Bey

Uygulamanızda yanlışlar var. 

Seri Monitörde gördüğünüz "ekstra 0" aslında Seri Monitör satır ayarında seçtiğiniz YENİ SATIR dan ve Serial.parseInt() den oluşan bir olaydır. YENİ SATIR ayarı girdinizin arkasına HEX(10) ekler ve bu da hakiki bir INT değer olmadığı için size "0" olarak yansır. Eğer SATIR AYARını ilk seçenek olarak ayarlarsanız bu "0" oluşmayacaktır.      

Ayrıca: Serial.available() kullanırken yazdığınız kod doğru değil. Serial.available() arkasından hemen if (Serial.available() == 0) yazmak bu kodun hiçbir zaman işlemeyeceği demektir. Size yardımcı olsun diye kodunuzun modifiye edilmiş bir versiyonunu sunuyorum. Motor kullanımı ile ilgili kısımları kapattım ki yalnız Serial I/O üzerine odaklansın diye. Bu örnekte Seri Portu nasıl okumanız gerektiğini ve gelen karakterleri nasıl kontrol edip uygulama içinde değerlendirmeniz gerektiği gösteriliyor. Çalıştırıp 1 veya 2 girin, veya hiç birşey yazmadan giriş yapın ve Seri Monitöre yazılanları inceleyin. Bunları değişik SATIR AYARları ile kullandığınızda hemen herşeyin nasıl çalıştığını anlayacaksınız.  İyi çalışmalar.    UYGULAMA INDIR:     https://drive.google.com/file/d/1RHeNLH0CgXigP65rNLiFvIj_YQtnXd9n/view?usp=sharing

 

 

emre
03.04.2019 - 10:38
Turgut Bey Teşekkür ederim yazdığınız kodu ufak bir değişiklikle çalıştırdım ancak çıktıya otomatik yeni satır geliyor