Serial.Read() ile çok basamaklı sayı alınması problemi. (Çözüldü)
  • Merhabalar ;

    Yapmaya çalıştığım proje şu arduino'ya serial monitor veya putty yardımıyla 4 adet sayı girilecek, bu sayılar 0 ile 5000 arasında değişiyor. Daha sonra bu sayılarla bazı matematiksel işlemler yapılacak ve sonuç elde edilecek.

    Takıldığım yer ise şu serial.read() ile birer birer rakam giriş yapabiliyorum ancak örneğin 2569 sayısını matematiksel işlem yapılabilecek şekilde arduino'ya aktaramıyorum. Bu sayı haricinde 3 adet daha girmem gerektiğinde ise işler iyice karışıyor. İnternetin bir yerine bu soruya bir cevap olduğundan eminim ama keyword olarak aklıma birşey gelmedi. bu arada atoi fonksiyonu ile yapmaya çalıştım ve beceremedim. Bu konuyla ilgili örnek varsa yada çözüm sunan bir kaynak varsa ve paylaşırsanız sevinirim.
  • Veri serialdan byte olarak gelir. Yani o durum normal. Bir buffer oluşturup, gelen veriyi ona atıp, oradan okutman lazım.

    http://arduino.cc/forum/index.php/topic,43311.0.html dekine benzer şekillerde yapabilirsin. Anahtar kelimelerin: "arduino serial.read multiple digits"
  • Ahmet bey yardımınız için teşekkür ederim. Örneklerin çoğunu inceledim ve bir derleme yaptım ancak farklı bir problem ile karşılaştım. Önce kodları ekliyorum: #include <stdlib.h> //atoi fonk için gerekli (stdlib.h ekleniyor site farklı algıladı.) char buffer[9]; //tüm veriyi tutacak dizi char dizi1[4]; //Tüm verinin ilk 4 değerinni tutacak dizi char dizi2[4]; //Tüm verinin sonraki 4 değerini tutacak dizi int alinan; // Döngüde kullanilacak void setup() { Serial.begin(9600); // Serial iletişim başladı alinan = 0; buffer[alinan] = '\0'; //İlk değere null Serial.print("Hazir!!"); } void loop() { if (Serial.available()) { buffer[alinan++] = Serial.read(); // Değeri oku buffer dizisine yaz buffer[alinan] = '\0'; if (alinan >= (sizeof(buffer)-1)) { dizi1[0] = buffer[0]; // ilk okunan 4 değeri dizi1'e yaz dizi1[1] = buffer[1]; dizi1[2] = buffer[2]; dizi1[3] = buffer[3]; dizi2[0] = buffer[4]; // sonra okunan 4 değeri dizi2'ye yaz dizi2[1] = buffer[5]; dizi2[2] = buffer[6]; dizi2[3] = buffer[7]; int sayi1 = atoi(dizi1);// Dizileri int'e çevir int sayi2 = atoi(dizi2); Serial.println("Buffer : "); // Görüntüle. Serial.println(buffer); Serial.print("1.Dizi : "); Serial.println(dizi1); Serial.print("2.Dizi : "); Serial.println(dizi2); Serial.print("1.Sayi : "); Serial.println(sayi1); Serial.print("2.Sayi : "); Serial.println(sayi2); alinan = 0; } } } 8 adet değer girdiğimde örneğin 12345678 aldığım değerler şöyle : Buffer : 12345678 'Burası normal komple buffer yazıldı 1.Dizi : 12345678 'Burada sorun var. Ben sadece ilk 4 değeri eşitledim.Zaten dizi1[4] olarak tanımlı. 8 tane değeri nasıl alıyor? 2.Dizi : 5678 'Burası normal son 4 değer. 1.Sayı : 21910 'Dizi atoi sınırları dışında olduğundan çevrimde sıkıntı oluyor 2.Sayı : 5678 'Burası da normal. Kullandığım ide 1.0.1 ve Arduino UNO Kullanıyorum. Serial iletişim için putty kullanıyorum çünkü serial monitorde değer girerken enter tuşuna bastığımda tuşu da bir değer olarak algılıyor , putty ise doğrudan basılan tuşu gönderiyor.
  • Problemi çok mantıksız olsa da şu şekilde çözebildim : #include <stdlib.h> //(stdlib.h include ediliyor)atoi fonk için gerekli char buffer[9]; //tüm veriyi tutacak dizi char dizi2[3]; //Tüm verinin sonraki 4 değerini tutacak dizi int alinan; // Döngüde kullanilacak char a0,a1,a2,a3,b0,b1,b2,b3; //Dizileri oluşturmak için değişkenler. void setup() { Serial.begin(9600); // Serial iletişim başladı alinan = 0; buffer[alinan] = '\0'; //İlk değere null Serial.print("Hazir!!"); } void loop() { if (Serial.available()) { buffer[alinan++] = Serial.read(); // Değeri oku buffer dizisine yaz buffer[alinan] = '\0'; if (alinan >= (sizeof(buffer)-1)) { a0 = buffer[0]; // ilk okunan 4 değeri değişkenlere ata a1 = buffer[1]; a2 = buffer[2]; a3 = buffer[3]; b0 = buffer[4]; // sonra okunan 4 değeri değişkenlere ata b1 = buffer[5]; b2 = buffer[6]; b3 = buffer[7]; char dizi1[]={a0,a1,a2,a3}; //ilk diziyi burada tanımla ve değişkenleri yerleştir. dizi2[0]=b0; //2.Diziyi en başta tanımladık! Değerlerini yaz. dizi2[1]=b1; dizi2[2]=b2; dizi2[3]=b3; int sayi1 = atoi(dizi1);// Dizileri int'e çevir int sayi2 = atoi(dizi2); Serial.println("Buffer : "); // Görüntüle. Serial.println(buffer); Serial.print("1.Dizi : "); Serial.println(dizi1); Serial.print("2.Dizi : "); Serial.println(dizi2); Serial.print("1.Sayi : "); Serial.println(sayi1); Serial.print("2.Sayi : "); Serial.println(sayi2); alinan = 0; } } } Görüntülenen Değerler : Buffer : 12345678 1.Dizi : 1234 2.Dizi : 5678 1.Sayı : 1234 2.Sayı : 5678
  • İlk değere null atadığın için olabilir. Null atamadan dener misin?

Howdy, Stranger!

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

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