Skip to Content
Arduino EğitimleriSeri Port Haberleşmesi

Seri Port Haberleşmesi

Seri port, Arduino ile bilgisayar arasındaki konuşma kanalıdır. İki temel işi vardır:

  • Hata ayıklama: Kodun içinde ne olup bittiğini görmek
  • Veri alışverişi: Bilgisayardan komut almak, karta veri göndermek

Arduino’da ekran yoktur; bir şeyin neden çalışmadığını anlamanın en hızlı yolu Serial.println() ile değerleri yazdırmaktır. Bu yüzden seri port, öğrenirken en çok kullanacağınız araçtır.

Başlatma

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

9600 baud hızıdır: saniyede aktarılan bit sayısı. Arduino ile Seri Monitör’ün aynı hızda olması zorunludur; farklıysa ekranda anlamsız karakterler görürsünüz.

Baud hızıKullanım
9600Varsayılan, en yaygın
115200Hızlı veri, ESP kartlarında standart
57600Bazı GPS ve modüller
4800Eski GPS modülleri

Çok fazla veri yazdırıyorsanız 115200 kullanın; 9600’de Serial.println() çağrıları programı belirgin şekilde yavaşlatır.

Veri Yazdırma

Serial.print("Metin"); // alt satira gecmez Serial.println("Metin"); // alt satira gecer Serial.println(); // bos satir

Sayı yazdırma

int sayi = 255; Serial.println(sayi); // 255 Serial.println(sayi, DEC); // 255 (onluk) Serial.println(sayi, HEX); // FF (onaltilik) Serial.println(sayi, BIN); // 11111111 (ikilik) Serial.println(sayi, OCT); // 377 (sekizlik)

Ondalık sayı hassasiyeti

float deger = 3.14159; Serial.println(deger); // 3.14 (varsayilan 2 basamak) Serial.println(deger, 4); // 3.1416 Serial.println(deger, 0); // 3

Okunabilir çıktı

void loop() { int sicaklik = 24; int nem = 55; Serial.print("Sicaklik: "); Serial.print(sicaklik); Serial.print(" C | Nem: %"); Serial.println(nem); delay(1000); }

SRAM Tasarrufu: F() Makrosu

Her sabit metin varsayılan olarak SRAM’e kopyalanır. Uno’nun 2 KB SRAM’i çok sayıda Serial.print("...") ile hızla dolar ve kart kararsızlaşır.

F() makrosu metni flash bellekte bırakır:

Serial.println(F("Bu metin SRAM tuketmiyor"));

Çok sayıda sabit metin yazdıran projelerde bu alışkanlık ciddi fark yaratır.

Veri Okuma

Bilgisayardan Arduino’ya komut göndermek için Seri Monitör’ün üst kısmındaki giriş kutusu kullanılır.

Tek karakter okuma

void setup() { Serial.begin(9600); pinMode(13, OUTPUT); Serial.println("a = LED ac, k = LED kapat"); } void loop() { if (Serial.available() > 0) { char komut = Serial.read(); if (komut == 'a') { digitalWrite(13, HIGH); Serial.println("LED acildi"); } else if (komut == 'k') { digitalWrite(13, LOW); Serial.println("LED kapandi"); } } }

Serial.available() tampondaki bekleyen bayt sayısını döndürür. Kontrol etmeden read() çağırmak -1 döndürür.

Sayı okuma

void loop() { if (Serial.available() > 0) { int deger = Serial.parseInt(); if (deger > 0) { Serial.print("Alinan sayi: "); Serial.println(deger); analogWrite(9, constrain(deger, 0, 255)); } } }

parseInt() sayısal olmayan karakterleri atlar ve ilk sayıyı okur. parseFloat() ondalıklı okur.

Satır okuma

void loop() { if (Serial.available() > 0) { String satir = Serial.readStringUntil('\n'); satir.trim(); // bosluk ve \r temizle Serial.print("Gelen: ["); Serial.print(satir); Serial.println("]"); if (satir == "ac") { digitalWrite(13, HIGH); } else if (satir == "kapat") { digitalWrite(13, LOW); } } }

trim() çağrısı önemlidir: Seri Monitör satır sonuna göre \r\n ekleyebilir ve bu karakterler karşılaştırmayı bozar.

String sınıfı kullanışlıdır ama Uno’da bellek parçalanmasına yol açar. Uzun süre çalışan projelerde char dizisi ve Serial.readBytesUntil() daha güvenlidir.

Seri Monitör Ayarları

Seri Monitör penceresinin altında iki açılır menü vardır:

Satır sonu (Line ending):

SeçenekGönderilen
No line endingSadece metin
NewlineMetin + \n
Carriage returnMetin + \r
Both NL & CRMetin + \r\n

readStringUntil('\n') kullanıyorsanız Newline veya Both seçmelisiniz; yoksa program satırın bitmesini sonsuza kadar bekler.

Baud hızı: Serial.begin() değeriyle aynı olmalıdır.

Seri Çizici (Serial Plotter)

Araçlar → Seri Çizici, sayıları grafik olarak çizer. Sensör davranışını anlamak için sayı listesine bakmaktan çok daha etkilidir.

Kullanım kuralı basittir: her satırda yalnızca sayılar olmalı, metin olmamalıdır.

void loop() { Serial.println(analogRead(A0)); delay(50); }

Birden fazla değeri aynı grafikte çizmek

Değerleri boşluk, virgül veya tab ile ayırın:

void loop() { Serial.print(analogRead(A0)); Serial.print(" "); Serial.print(analogRead(A1)); Serial.print(" "); Serial.println(analogRead(A2)); delay(50); }

Etiketli çizim (IDE 2.x):

Serial.print("Ham:"); Serial.print(ham); Serial.print(",Filtreli:"); Serial.println(filtreli);

Bu, bir filtrenin işe yarayıp yaramadığını görmenin en hızlı yoludur: iki eğriyi üst üste çizin.

Diğer Serial Fonksiyonları

Serial.flush(); // gonderilen verinin cikmasini bekle Serial.end(); // seri portu kapat Serial.setTimeout(500); // parseInt/readString bekleme suresi (ms) while (Serial.available()) { Serial.read(); // tamponu temizle }

SoftwareSerial — İkinci Seri Port

Arduino Uno’da yalnızca bir donanımsal seri port vardır (D0/D1) ve o da USB’ye bağlıdır. Bluetooth veya GPS modülü bağlamak isterseniz ikinci bir porta ihtiyaç duyarsınız.

SoftwareSerial kütüphanesi, herhangi iki dijital pini seri port gibi kullanmanızı sağlar.

#include <SoftwareSerial.h> SoftwareSerial bluetooth(10, 11); // RX, TX void setup() { Serial.begin(9600); // bilgisayar bluetooth.begin(9600); // modul Serial.println("Hazir"); } void loop() { // Bluetooth'tan gelen -> bilgisayara if (bluetooth.available()) { Serial.write(bluetooth.read()); } // Bilgisayardan gelen -> Bluetooth'a if (Serial.available()) { bluetooth.write(Serial.read()); } }

Bağlantıda çapraz kural: Arduino’nun RX pini modülün TX’ine, TX pini modülün RX’ine bağlanır.

SoftwareSerial’in sınırları

  • Yazılımsal olduğu için CPU’yu meşgul eder; yüksek baud hızlarında (>38400) veri kaybı olur.
  • Aynı anda yalnızca bir SoftwareSerial portu dinlenebilir.
  • Kesme kullanan başka kütüphanelerle çakışabilir.

Birden fazla seri cihaz gerekiyorsa Arduino Mega kullanın: dört donanımsal seri portu vardır (Serial, Serial1, Serial2, Serial3).

Seri Port Sorunları

BelirtiNeden
Anlamsız karakterlerBaud hızı eşleşmiyor
Hiç çıktı yokSerial.begin() yazılmamış; yanlış port seçili
Kod yüklenmiyorD0/D1’e modül bağlı — çıkarın
readStringUntil takılıyorSeri Monitör’de satır sonu ayarı “No line ending”
Program yavaşladıÇok fazla Serial.print(); baud hızını 115200 yapın
Kart resetleniyorSeri Monitör açıldığında Arduino resetlenir — bu normaldir
Leonardo’da ilk çıktılar kayıpwhile (!Serial); satırını ekleyin

Seri Monitör açılınca kart neden resetleniyor?

Arduino Uno’da seri bağlantı kurulduğunda DTR sinyali kartı resetler. Bu, kod yüklemeyi otomatikleştiren bir özelliktir.

Bu davranışı istemiyorsanız (örneğin veri kaydeden bir projede), RESET pini ile 5V arasına 10 µF kondansatör bağlamak yaygın bir çözümdür.

Özet

Seri port, Arduino ile bilgisayar arasındaki veri kanalıdır. Serial.begin() ile başlatılır, print/println ile veri yazılır, available/read ile veri okunur.

Bu derste şunları öğrendik:

  • Baud hızı eşleşmesinin zorunlu olduğunu
  • Sayı ve ondalık yazdırma biçimlerini
  • F() makrosuyla SRAM tasarrufunu
  • Serial.available(), parseInt() ve readStringUntil() ile veri okumayı
  • Satır sonu ayarının neden önemli olduğunu
  • Seri Çizici ile grafik çizmeyi
  • SoftwareSerial ile ikinci seri port oluşturmayı ve sınırlarını