Arduino ile Seri İletişim - 2
Önceki yazımızda Arduino ile seri iletişimin temellerini ve Arduino ile verileri nasıl göndereceğimizi görmüştük. Şimdi de Arduino’ya nasıl veri gönderebileceğimize bakacağız. Bunun için yine Serial Monitor’ü kullanacağız. Ancak Arduino’ya veri göndermek için elimizdeki tek araç bu değil. Bilgisayarımızda USB üzerinden oluşturulan ve ismi COMx şeklindeki seriporta erişebilen bütün programları Arduino’ya veri göndermek için kullanabiliriz. Seri iletişimdeki temel nokta verilerin baytlar serisi halinde gönderilmesidir. Baytlara bölebildiğiniz bütün verileri Arduino’ya rahatlıkla gönderebilirsiniz.
Serial Monitor ile Arduino’ya Veri Gönderme
Serial Monitor ile Arduino arasında veri alışverişi yapmak için Arduino geliştirme ortamından Serial Monitor butonuna basalım:
Seria Monitor’ün üst bölümünde bir kutucuk ve sağ tarafta da “Send” butonu bulunuyor. Kutucuğa yazdığımız karakterler Send butonuna basıldığında sağ alt köşede seçilmiş olan hız değerinde Arduino’ya gönderilir. Arduino’dan bu verileri okumak için programımızda da aynı hız değerini kullanmalıyız.
Serial Monitor’den gönderdiğimiz veriler daha önce de bahsettiğimiz gibi baytlar halinde gönderilir. Yani kutucuğa “ARDUINO” yazdığımızda bunlar her bir karakterin ASCII karşılığı şeklinde gönderilecektir:
A 65
R 82
D 68
U 85
I 73
N 78
O 79
Bir karakterin ASCII tablosunda sayısal bir karşılığı olduğundan daha önce bahsetmiştik. Karakter dizilerinin desimal sayı karşılıklarını görüntülemek için http://easycalculation.com/ascii-hex.php adresindeki aracı kullanabilirsiniz.
Dolayısıyla Arduino’da
Serial.write(65);
Serial.write(‘A’);
komutları aynı işi yapacaktır. Tek fark birisinde karakterin sayısal karşılığını yazarken diğerinde kendisini yazıyoruz.
Seri iletişim yoluyla Arduino’ya gelen verileri okuma
Arduino’ya seri iletişim üzerinden gelen veriler belirli bir kapasitedeki bellekte (128 bayt) saklanır. Buna “tampon bellek” de denilebilir. Program içerisinde okunana kadar veriler tampon bellekte tutulur. Bu belleğin kapasitesi sınırlı olduğundan veriler belirli bir süre içerisinde okunmazsa yeni gelen veriler eskisinin üzerine yazılabilir.
Belirli bir anda bellekte okunmayı bekleyen verilerin sayısını Serial.Avaliable() fonksiyonu ile öğrenebiliriz:
Serial.Avaliable() fonksiyonunun döndürdüğü değer sıfırdan farklı ise okunmayı bekleyen veriler var demektir.
Gelen verileri Serial.read() ile okuyabiliriz. Serial.read() fonksiyonu tampon bellekte bekleyen verilerden ilk gelmiş olanı bize verir. Yani tampon belleğe ilk gelen veri ilk okunur. Buna “ilk gelen ilk okunur – first in first out – FIFO) bellek” denilir.
Serial.read() fonksiyonu ile her seferinde bir bayt okunur ve bu bayt tampon bellekten silinir.
Şimdi örnek bir programda bu fonksiyonların kullanımını görelim:
int gelenVeri = 0; // genel veriyi tutacak değişken char gelenKarakter; void setup() { // Seri haberleşmeyi başlatıyoruz (9600 bps hızında) Serial.begin(9600); } void loop() { // Veri gelmiş mi? if (Serial.available() > 0) { // gelen veriyi oku gelenVeri = Serial.read(); gelenKarakter = gelenVeri; Serial.print("Gelen Veri: "); Serial.println(gelenVeri); Serial.print("Gelen Karakter: "); Serial.println(gelenKarakter); } }
Programımızı Arduino’ya yükleyip ardından Serial Monitor’ü çalıştıralım. Üst bölümdeki kutucuğa “A” harfi yazıp “Send” butonuna tıkladığımızda Arduino bize aşağıdaki verileri yollayacaktır:
gelenVeri değişkeni int, gelenKarakter değişkeni ise char tipindedir. Serial.Print() ve Serial.Println() fonksiyonları kendilerine verilen parametrelerin cinsine göre çıktı üretmektedirler.
Yazıyla ilgili yorumlarını aşağıda yapabilirsiniz. Bir sonraki yazıda Arduino ile Seri haberleşme işlemlerini nasıl yapacağımızı görmeye devam edeceğiz…



