Arduino Seri Port Nesnesi Detaylı Anlatım

İleri seviye arduino eğitimi kategorisindeki ilk dersimizde Seri Port nesnesini detaylı olarak ele alacağız.

Daha önceki Seri Port Ekranı Kullanımı dersimizde seri port nesnemizin bazı fonksiyonlarını ele almıştık. Bu dersimizde ise Seri Port nesnemizin tüm fonksiyonlarını detaylı olarak anlatmaya çalışacağız.

Öncelikle bu fonksiyonların bir listesine bakalım;

  1. begin()
  2. print()
  3. println()
  4. available()
  5. read()
  6. readBytes()
  7. readBytesUntil()
  8. readString()
  9. readStringUntil()
  10. write()
  11. availableForWrite()
  12. setTimeout()
  13. end()
  14. find()
  15. findUntil()
  16. flush()
  17. parseFloat()
  18. parseInt()
  19. peek()
  20. serialEvent()
  21. if(Serial)

Şimdi bu fonksiyonları bir bir ele alalım.

1- Serial.begin();

Bu fonksiyonumuz yeni bir seri haberleşme tanımlamak için kullanılır.  Daha önce bu fonksiyonumuzun setup() yapısında birçok kez kullanıldığına şahit olmuştuk. Serial.begin() fonksiyonumuz Arduino UNO için 0 ve 1 numaralı pinlerinde bulunan fiziksel seri haberleşme özelliğini aktif eder. Bu fonksiyonumuz “seri haberleşme hızı, iletilecek bilginin bit sayısı, parity (eşlik) biti’nin kaç bitten oluşacağı ve stop bitinin kaç bitten oluşacağı” olmak üzere 4 adet parametre alır. Yalnızca seri haberleşme hızını girerek de kullanılabilir.

Şimdi Serial.begin() fonksiyonun alabileceği parametrelere bakalım;

Sözdizimi: Serial.begin(baudRate, yapılandırma);

baudRate : Bu özellik olmazsa olmaz olan seri portun saniyede göndereceği ve alacağı bit sayısını belirler. Seri portun haberleşeceği cihaz ile aynı olmak zorundadır. Eğer aynı olmaz ise göndereceğiniz ya da alacağınız verilerin haberleşme yaptığınız cihaz ile çok farklı olduğunu görürsünüz. Çoğu cihazın seri haberleşme hızı 9600 Baud Rate’dir. Bu değer cihaz saniyede 9600 bit gönderip alabilir demektir. 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 değerleri alabilir.

yapılandırma: SERIAL_XYZ şeklinde yapılandırma yapılabilir. XYZ değerlerinin açıklamaları aşağıda belirtilmiştir;

X = Data Bit değeridir. Bu özellik ise seri porttan gönderilecek her bir verinin kaç bitten oluşacağını belirler. 5 ile 8 bit arasında bir değer alabilir.

Alabileceği değerler ise; 5, 6, 7 ve 8’dir. Varsayılan değeri “8”dir.

Y = Parity yani eşlik biti değeridir.  Bu özellik seri port ile gönderilecek her bir verinin ardından gönderilecek eşlik bitini belirtmek için kullanılır. Eşlik biti gönderilen verinin karşı tarafa hatalı gidip gitmediğini kontrol etmek içindir.

Alabileceği değerler; N,O ve E değerleridir. Varsayılan değeri “N”dir.

“N” değeri “None” yani Parity biti gönderilmeyecek demektir. “O” değeri “One” yani “1” bitlik parity biti gönderileceğini, E değeri ise “Even” yani “2” bit parity biti gönderileceğini belitmek için kullanılır.

Z = Gönderilecek verinin sonuna eklenecek olan Stop Biti sayısını temsil eder. 1 ve 2 değerini alabilir. Aldığı değer kadar gönderilen verinin sonuna stop biti ekler. Varsayılan değeri “1”dir.

Yani biz Serial.begin(9600); yazdığımızda yapılandırma otomatik olarak SERIAL_8N1 değerini kullanır.

Eğer biz 9600 baud rate hızında, 8 bitlik data biti, 2 bitlik parity (eşlik) biti ve 1 bitlik stop biti gönderilecek şekilde seri portu yapılandırmamız gerekirse begin() fonksiyonumuz şu şekilde olmalıdır;

Serial.begin(9600, SERIAL_8E1);

Şimdi ikinci fonksiyonumuz olan print fonksiyonuna geçelim.

2- Serial.print() Fonksiyonu:

Bu fonksiyon gönderilecek olan verinin ASCII standartlarında gönderilmesini sağlar. Yani veriyi karşıya direkt karakter olarak gönderir.  Bu fonksiyon ile gönderilen veriler makina tarafından ekrana basılabilir ve insan tarafından okunabilir.

Sözdizimi; Serial.print(gonderilecekVeri);

Direkt olarak girilen karakterleri seri porta gönderse de ikinci bir parametre olarak gönderilecek verinin formatı belirlenebilir;

Serial.print(veri,format);

İzin verilen format değerleri; BIN (Binary yani 2 tabanlı veri), OCT (Octal yani 8 tabanlı veri), DEC (Decimal yani 10 tabanlı veri) veya HEX (Hexadecimal yani 16 tabanlı veri) olarak gönderilebilir.

Ondalıklı sayılar için ise ikinci parametre noktadan sonra gösterilecek basamak sayısını belirleyebilir;

3- Serial.println() Fonksiyonu:

Serial.println() fonksiyonu Serial.print() fonksiyonu ile tamamen aynı işlemi yapar, Ancak bu fonksiyon gönderdiği her verinin sonuna Satır Başı (ASCII 13 veya ‘\r’) karakteri ve ardından Yeni Satır(ASCII 10 veya “\n”) karakterini ekler. Böylelikle gönderilen her veride alıcı cihaz alt satırdan devam eder.

Sözdizimi; Serial.println(gonderilecekVeri);

4- Serial.available() Fonksiyonu:

Serial.available() fonksiyonu seri port arabelleğindeki (buffer) alınana byte sayısını verir. Biz seri porta gelen veriyi almadan önce bu veriler seri port arabelleğine kayıt edilir. Seri port arabelleği 64 byte değerindeki veriyi saklayabilecek kapasitededir. Biz Serial.available() fonksiyonu ile gelen verinin kaç byte’dan oluştuğunu öğrenebiliriz. Fonksiyon, herhangi bir parametre almaz ve gelen verinin byte sayısını integer cinsinden değer olarak bize verir.

Sözdizimi: Serial.available();

Bu fonksiyonu seri porta veri gelip gelmediğini anlamak için de kullanabiliriz.

Örneğin seri porta veri geldiğinde, gelen verileri alan program yazalım;

5- Serial.read() Fonksiyonu:

Serial.read() fonksiyonu, seri porta gelen verileri okumak için kullanılır. Okunan bu verileri bir değişkene atayarak kullanabilirsiniz.

Sözdizimi: Serial.read();

Örnek olarak seri porta gelen bir sayıyı  alalım ve değişkene atayalım;

6- Serial.readBytes() Fonksiyonu:

Serial.readBytes() fonksiyonumuz seri porttan gelen verileri char ya da byte dizisi olarak okumak için kullanılır. Gelen veriler byte ya da char dizisine aktarılabilir. Gelen verilerin belli bir bölümünü okumak için de kullanılabilir. İki adet parametre alır. Birinci parametre verilerin aktarılacağı dizi, ikinci parametre ise seri porttan kaç byte veri okunacağını bildirir.

Sözdizimi: Serial.readBytes(verilerinAktarılacağıDizi, okunacakByteSayısı);

Örnek olarak seri porta gelen verilerin tamamını okuyup bir byte dizisine kaydedelim;

Bir başka örnekle gelen verinin ilk 5 byte’ını okuyalım;

7- Serial.readBytesUntil() Fonksiyonu:

Seri porttan gelen verileri belli bir karaktere kadar okumaya yarar. Belirlenen karaktere ulaşıldığında okuma işlemi sona erer ve belirtilen karakter arabellekten temizlenir.

Sözdizimi: Serial.readBytesUntil(karakter, buffer, lenght);

karakter: hangi karakter gelince okuma sona ersin (char)

buffer: okunan verinin aktarılacağı dizi (byte[] ya da char[])

lenght: okunacak byte sayısı (int)

Örnek olarak seri pottan 15 byte veri okuyalım ancak okunan verinin içerisinde ASCII 0x3 nolu End Of Text karakteri geldiğinde okumayı sonlandıralım. Kodlarımız şu şekilde olacak;

Yukarıdaki kodda, Serial.readBytesUntil(0x3,gelen,15); komutu ile seri porta gelen verinin 15 byte’ını okuyacağımızı söyledik, ancak bu okunan byte dizisi içerisinde ASCII 3 numaralı End Of Text verisi gelirse okumayı sonlandırması gerektiğini belirttik. Eğer bu 15 byte okunurken onuncu byte’da 0x3 verisi gelirse, okuma sona erecek ve buffer’dan okunan veriler ile birlikte 0x3 verisi silinecektir.

8- Serial.readString() Fonksiyonu:

Bu fonksiyonumuz seri porttan gelen verileri string (metin) olarak okur.

Sözdizimi: Serial.readString();

Örnek olarak gelen bir veriyi string olarak okuyalım;

9- Serial.readStringUntil() Fonksiyonu:

Serial.readStringUntil() Fonksiyonumuz seri porttan gelen verileri belirlenen karaktere kadar okur.

Sözdizimi: Serial.readStringUntil(karakter)

karakter: char türü herhangi bir ASCII karakter

Örneğin seri porttan gelen verileri “a” karakterine rastlayıncaya dek okuyalım;

10- Serial.write() Fonksiyonu:

Seri porta byte türünde veri göndermek için kullanılır. Eğer metin ve sayı türü veri gönderecekseniz print() fonksiyonunu kullanınız.

Söz dizimi:

Serial.write(byteDeğer);

byteDeğer: gönderilecek 1 byte değerindeki veri.

Serial.write(byteDizi);

byteDizi: byte dizisi elemanı

Serial.write(byteDizi, uzunluk);

byteDizi: byte dizisi

uzunluk: dizinin kaç byte’ı gönderileceği

11- Serial.availableForWrite() Fonksiyonu:

Seri port ile veri gönderme işlemini engellemeden seri port arabelleğinden yazılabilir byte sayısını alır. Geriye integer türü değer döndürür.

Sözdizimi: Serial.availableForWrite();

12- Serial.setTimeout() Fonksiyonu:

Bu fonksiyon seri porta veri okuma/yazma yapmak için beklenecek maksimum zamanı milisaniye cinsinden belirtir. Yani seri port zaman aşımıdır. Varsayılan değeri 1000 milisaniye yani 1 saniyedir. Bu fonksiyon ile belirtilen zaman değeri aşılırsa, seri port okuma/yazma işlemini durdurur.

Sözdizimi: Seril.setTimeout(zamanAşımıDeğeri);

Kullanım Şekli:

Seri port zaman aşımı değerini kullanan seri port işlevleri aşağıdakilerdir;

  • Serial.find()
  • Serial.findUntil()
  • Serial.parseInt()
  • Serial.parseFloat()
  • Serial.readBytes()
  • Serial.readBytesUntil()
  • Serial.readString()
  • Serial.readStringUntil()

13- Serial.end() Fonksiyonu:

Seri portu devredışı bırakarak RX ve TX pinlerini dijital giriş/çıkış olarak kullanılmasına izin verir. Bu fonksiyondan sonra tekrar seri portu etkinleştirmek için Serial.begin() fonksiyonu kullanılır. Serial.end() fonksiyonu herhangi bir parametre almaz ve geriye değer döndürmez.

Sözdizimi: Serial.end();

14- Serial.find() Fonksiyonu:

Seri porta gelen veride belirlenen karakteri arar. Char türü parametre alır. Eğer karkteri bulursa TRUE, bulamazsa FALSE sonucu döndürür.

Sözdizimi:

Serial.find(arananKarakter);

arananKarakter türü char olmalı.

Serial.find(arananKarakter, uzunluk);

gelen verinin belirtilen uzunluktaki miktarında belirtilen karakteri arar.

 

Örneğin gelen veri içerisinde “a” karakterini arayalım;

15- Serial.findUntil() Fonksiyonu:

Belirtilen karaktere kadar belirtilen karakteri aramak için kullanılan seri port nesnedi fonksiyonudur. İki adet parametre alır. Birinci parametre aranacak karakter, ikinci paramere ise hangi karaktere kadar aranacağıdır. Geriye dönüş değeri bool türündendir.

Sözdizimi: Serial.findUntil(aranacakKarakter, hangiKaraktereKadarAranacağı);

Örneğin seri porta gelen veri içerisinde ‘x’ karakteri ile karşılaşıncaya kadar ‘y’ karakterini arayalım;

16- Serial.flush() Fonksiyonu:

Bu fonksiyon gönderilen seri veri iletiminin tamamlanmasını beklemek için kullanılır. Herhangi bir parametre almaz ve geriye değer döndürmez. Arduino 1.0’dan önce, bunun yerine arabellekte gelen tüm seri verileri silinir.

Sözdizimi: Serial.flush();

Örnek;

17- Serial.parseFloat() Fonksiyonu:

Bu fonksiyon seri arabellekten rastladığı ilk ondalıklı sayıyı ve okumaya devam edilirse rastladığı tüm ondalıklı sayıları döndürür. Rakam olmayan karakterler atlanır. Eksi işareti dahil edilir.

18- Serial.parseInt() Fonksiyonu:

Bu fonksiyon seri port arabelleğinden geçerli ilk tamsayıyı alır. Rakam olmayan değerler atlanır. Zaman aşımı değeri aşıldığında ya da herhangi bir tamsayı bulunmadığında işlem sonlanır ve sıfır değeri döndürülür. Ayrıştırma karakteri belirlemek için char türünden parametre alabilir.

Sözdizimi:

Serial.parseInt();

Serial.parseInt(ayrıştırmaKarakteri);

ayrıştırma karakteri char türündendir. Gelen veride tire, virgül gibi belirli karakterleri atlamamızı sağlar.

Örneğin seri porttan gelen verilerden tamsayı olan veriyi alalım;

19- Serial.peek() Fonksiyonu:

Serial port nesnesinin bu fonksiyonu ise, seri porta gelen verinin bir sonraki byte değerini döndürür. Örneğin seri porttan okuma yaparken birinci byte değerini okuduğumuzu varsayalım, ikinci byte değerini okumadan önce gelen byte değerini kontrol edip, ardından veriyi almak istersek önce Seril.peek() fonksiyonuyla veriyi kontrol ederiz. Serial.peek() fonksiyonuyla okuduğumuz veri arabellekten silinmez. Bu fonksiyonumuz herhangi bir parametre almaz ve geriye dönüş değeri integer cinsindendir. Eğer veri mevcut değilse -1 sonucunu döndürür.

Örnek olarak gelen verinin ilk byte değeri 0x4A ise, bu veriyi okuyalım, eğer 0x4A değilse, okumayı iptal edelim;

 

20- serialEvent() Fonksiyonu:

Bu fonksiyon birden seri portu dinler ve veri geldiğinde veriyi yakalamak için kullanılır. Binevi seri port kesmesi gibi davranır. Bu işlemi loop() döngüsünden bağımsız olarak yapar. Yani loop() döngüsünde kodlarımız çalışırken, seri porta bir veri geldiğinde, serialEven() fonksiyonumuz o veriyi alır ve tanımladığımız değişkende saklar. İstediğimiz zaman değişkende saklanan verileri kullanabiliriz.

Örnek olarak loop() döngüsünden bağımsız olarak gelen verileri alalım ve ardından loop() döngüsünde veriyi seri porta geri gönderelim.

 

21- if(Serial):

Yerleşik USB bulunan kartlarda if(Serial) ya da if(SerilaUSB) komutu USB için seri bağlantının hazır olup olmadığını kontrol etmek için kullanılır. Eğer bağlantı hazır ise TRUE sonuç döndürecektir. USB olmayan diğer tüm CDC portları ve Uno, Nano, Mini, Mega, Uno WiFi Rev.2 kartları için bu komut her zaman TRUE sonuç döndürecektir.

Örnek olarak USB portu hazır olunca USB port hazır mesajı gönderen kodumuzu yazalım;

Yukarıdaki kod Arduino Uno, Nano, Mini, Mega, Uno WiFi Rev.2 kartlarında çalışmaz!

Yorum Yap