Arduino Android veri aktarımı.(çözüldü)
  • Merhaba. 2 aydır Arduino Bluetooth ve Android üzerinde çalışıyorum. Ufak bir sorunum var.

    telefon, arduşdan gelen veriyi işleyip cevap veriyor sıkıntı yok. ama telefon cevap gönderince arduino ya bunu bir türlü anlatamıyorum. :)

    Telefonuma diyorum ki; şu data gelirse şu cevabı gönder.
    GELEN DATA : a451|231.
    a=başlangıç |=ayraç .=bitiş (rakamlar değişken)

    telefon bunu süper bir şekilde yorumlayıp hemen cevap gönderiyor b214|843.

    arduino ya diyorum ki b ile başlayan veri olursa bunu değişkenime kaydet. ben onu sonra kesip biçerim.

    arduino efendi gelen veriyi değişkene sadece b olarak kaydediyor. oysa ki verinin tamamı b214|843. şeklinde.

    koddaki Serial.write(blGelen); kısmını if den çıkarırsam 500ms de bir kez okuyor. b214|843. tamamını serial monitörde görüyorum. gerekli-gereksiz tüm veriler yukarı kayıp gidiyor. tutamıyorum :)

    KODUM ŞU ŞEKİLDE

    void setup() {
    Serial.begin(9600);
    bl.begin(9600);
    }

    void loop() {
    delay(500);
    bl.listen();

    while (bl.available() > 0) {
    char blGelen = bl.read();
    if(blGelen=='b'){
    Serial.write(blGelen);
    }
    }


    fikri olan yazsın lütfen. teşekkürler.
  • önce gelen verileri bir char array e at, ondan sonra ayıklayabilirsin.
  • if(blGelen=='b'){
    char blGelen2 = bl.read();
    Serial.write(blGelen2);
    }

    böyle yapıncada değişkene sadece 2 yi kaydediyor.
    gelen b214|843. verisinin b den sonra gelen rakamı kaydetmiş. :(
  • @bsenguler cevabınız için teşekkür erim. Arrayı [] boş bıraktım ki uzunluğu kendi hesaplasın. Aşağıdaki şekilde denedim

    if(blGelen=='b'){
    char gelenArray[] = bl.read();
    Serial.write(gelenArray);
    }

    şeklinde denediğimde hata veriyor.
    array must be initialized with a brace-enclosed initializer
    araştırdım ama bir sonuca ulaşamadım.
  • array indeksi boş bırakılamaz.Bir deger atamak zorundasınız.
  • Biraz C çalışsanız iyi edersiniz. char veri tipi sadece 1 byte depolayabilir. Daha fazlası için char dizisine ihtiyaç var. Dizilerin uzunluğu sabit olur, sonradan belirlenemez.

    Sadece b ile başlayanları mı alacaksınız? Başka harfle başlayanlar ne olacak?
  • @bsenguler array köşeli parantez içerisindeki değer index uzunluğu.
    char harfler[] = {'A','R','D'} şeklinde tanımlarsak otomatikman [3] kabul eder.
    elle girmek zorunda değiliz. Fakat yinede denedim aynı hatayı aldım :(
    char gelenArray[10] = bl.read();
    hata: array must be initialized with a brace-enclosed initializer


    @amenofis C ile tüm arduino severler çalışmak zorunda. bizler daha işin başındayız. :) şu an serialden gelen veriyi arraya tanımlama peşindeyim. diğer sorunuz ise saece b ile başlayanlar değil. fakat önce bunu başarmalıyım C D E gibi diğer varyasyonlar bu çözümün tekrarı olacak :)
    cvplarınız için teşekkürler.
  • Aşağıdaki fonksiyon geçerli bir veri gelene kadar bekler ve veriyi char dizisine yazar. Yapman gereken char veri[N]; şeklinde bir global değişken tanımlamak. N toplam karakter uzunluğunun 1 fazlası. Test etmek için Serial.println(veri); kullanabilirsin.

    void veriyiAl()
    {
    char kar;
    do {
    while(Serial.available() == 0);
    kar = Serial.read();
    }
    while(kar < 'a' || kar > 'z');

    veri[0] = kar;
    uint8_t i = 0;
    do {
    while(Serial.available() == 0);
    veri[++i] = Serial.read();
    }
    while(veri[i] != '.');

    veri[++i] = '\0';
    }
  • char gelenArray[10] = bl.read();
    böyle bir tanımla ve değer atama durumu söz konusu değil.
    @amenofis inde dedigi gibi temel C konularına bakmalısın.
  • @amenofis @bsenguler cevaplarınız yoluma ışık tuttu teşekkürler. araştırmalar ve öğrendiklerimle bir kod yazdım. ve çalışıyor.

    Sorun şu ki;
    serialden gelen verinin uzunluğunu nasıl bulabilirim. Array[index] ini ona göre ayarlamam gerek. gelen veri indexleri devamlı değişiyor.

  • Telefondaki uygulamaya müdahale edebiliyorsan basit bir şekilde her veri paketinin önüne 1 byte uzunluk bilgisi koyarak çözebilirsin.

    Arduino tarafında ise gelecek olan maksimum veri uzunluğunu bilmen ya da tahmin etmen gerekiyor. Ona göre sabit bir bellek tahsisi yapacaksın. Atmega328'de 2 kb ram var ona göre.
  • Çözüm yazmayı unutmuşum. Telefondan gelen veri başına array index uzunluğunu ekledim. Ard ile yorumladım. Ard eprom adres kayıtlarının arasındaki mesafeyi uzattım. Verileri unsigned char a çevirdim. Yol gösterenlere teşekkürler.

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.