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 |
|---|---|
| 9600 | Varsayılan, en yaygın |
| 115200 | Hızlı veri, ESP kartlarında standart |
| 57600 | Bazı GPS ve modüller |
| 4800 | Eski 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 satirSayı 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); // 3Okunabilir çı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.
Stringsınıfı kullanışlıdır ama Uno’da bellek parçalanmasına yol açar. Uzun süre çalışan projelerdechardizisi veSerial.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çenek | Gönderilen |
|---|---|
| No line ending | Sadece metin |
| Newline | Metin + \n |
| Carriage return | Metin + \r |
| Both NL & CR | Metin + \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ı
| Belirti | Neden |
|---|---|
| Anlamsız karakterler | Baud hızı eşleşmiyor |
| Hiç çıktı yok | Serial.begin() yazılmamış; yanlış port seçili |
| Kod yüklenmiyor | D0/D1’e modül bağlı — çıkarın |
readStringUntil takılıyor | Seri 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 resetleniyor | Seri Monitör açıldığında Arduino resetlenir — bu normaldir |
| Leonardo’da ilk çıktılar kayıp | while (!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 tasarrufunuSerial.available(),parseInt()vereadStringUntil()ile veri okumayı- Satır sonu ayarının neden önemli olduğunu
- Seri Çizici ile grafik çizmeyi
SoftwareSerialile ikinci seri port oluşturmayı ve sınırlarını