Arduino serialEvent ve loop çakışması
  • Merhabalar arkadaşlar,

    Bir süredir üzerinde çalıştığım sensör bilgisi okuyan bilgisayar kontrollü, kablosuz omnidirectional robot üzerinde çalışıyorum. RF linkini seri port üzerinden okuyorum. Son zamanda projeye bir display aracı eklemem gerekti, bu display aracı sensör bilgisini araçta direkt gösterecek. Lakin şöyle bir problemim var : serialEvent ve loop scope'ları çakışıyor. Örnek vermem gerekirse, serialEvent'e gönderdiğim karakterin işlemi yapması gerekirken loop()'taki veri okumanın ve display animasyonlarının bir tur dönmesini bekliyor, sonra okuduğu veriyi işliyor. Halbuki ben loop() taki işlemlerin arkaplanda sürekli çalışmasını ve serialEvent'in de aldığı veriyi hemen işlemesini istiyorum. serialEvent scope'u klasik bildiğimiz karakter okuma mantığında, loopta da led animasyonu , bir kaç davranış kontrolü ve sensör bilgisi gösterme var. Bu konuda yaptığım google araştırmasında iki sonuç ile karşılaştım : birincisi, processing skecini kullanarak draw() üzerinden gitmek, ikincisi ise interruptları kullanmak. processing bu projede veri alma verme açısından tam olarak isteklerime -ne yazıkki- karşılık vermedi. interrupt kullanmayı da tam olarak bilmiyorum. Asıl yapmak istediğim iş serialEvent() teki işlemlerin bir nevi kesintiden kurtulması. Yani bu da tam olarak işime yaramayacak zannediyorum. Son çare olarak loop()'taki olayları serialEvent fonksiyonundaki durumlar içerisine gömebilirim, fakat bu da seri rx tepkilerini geciktiriyor haliyle. Umarım sorunumu anlatabilmişimdir. Eğer böyle bir problem ile karşılaşan varsa yardım bekliyorum. Teşekkür ederim.
  • http://arduino.cc/en/Tutorial/SerialEvent baktığımda "SerialEvent() is called after a loop(), if there is serial data in the buffer. " buradan anlaşılıyorki serial event rutini her looptan sonra çağırılıyor.
    şöyle bir şey yapabilirsin belki; loop içindeki her şeyi bir rutine topla ve duruma göre looptan onu çağır.
    serialevent kısmında bir değişkeni kontrol et ve istediğin zaman hersey rutinini calıstır.

    boolean herseyyap = false;

    void setup() {
    // initialize serial:
    Serial.begin(9600);
    // reserve 200 bytes for the inputString:
    inputString.reserve(200);
    }

    void loop() {
    if (herseyyap == true) {
    hersey();
    }
    }

    void hersey() {
    bla bla
    }

    void serialEvent() {
    while (Serial.available()) {
    bla bla
    herseyyap=true;
    }
    }
  • Eğer yapacağım işlem çok kısa bir işlemse, zaten gecikme farkedilmiyor. fakat yapacağım işlem çok uzun delayler içeriyor ve bunu serialevent ten bağımsız kılmak istiyorum. dediğiniz olayı denedim fakat bu sefer de temelli olarak seri bilgi alımını kesiyor bu işlemleri sürdürürken. yani yine bağımsız olmuyor.
  • peki ozaman serialevent kendi uzun rutinlerinin içinden arada bir çağırmayı dene.
  • öyle yapılabiliyor problem yok fakat senkronizasyon tutmuyor, çünkü serial event içinde aracın aldığı bir sürü komut var. Ama dediğim şu: arada bir çağırmak değil benim amacım. devamlı arkaplanda çalışsın istiyorum.
  • interrupt kullan diyeceğim de korkuyorum :)
  • Merhaba mozcelikors sorunu çözüldümü. Ben de ayni olayla karşılaştım. TFT Touch ekran devreme ekledikten sonra SerialEvent çalışmıyor. void loop() içerisine while ile alakalı. ne yapmam gerekiyor.

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.