14
Mar
2023

UART protokolü

UART (Universal Asynchronous Receiver Transmitter), yani evrensel asenkron alıcı verici haberleşme, aygıtlar arası seri iletişim için en sık kullanılan protokollerden biridir. UART, Ad-Hoc türünde bir protokoldür. Bir Ad-Hoc ağı iki aygıt arasında doğrudan kurulabilir ve herhangi bir ağ yönetim cihazına ihtiyaç duymaz.

UART aygıtı Tx (Transmitter) ve Rx (Receiver) adında iki bağlantı pinine sahiptir. Tx pini veriyi gönderir, Rx pini ise alır.

UART ile iletişim üç şekilde gerçekleşebilir:

  1. Simplex: Tek yönlü iletişim türüdür. Bir aygıt veriyi sadece gönderir, diğeri sadece alır.
  2. Half duplex: İki yönlü iletişim türüdür. Her iki aygıt birbirine veri gönderebilir, ancak aynı anda gönderemezler.
  3. Full duplex: Her iki aygıt birbirine aynı anda veri gönderebilir.

UART ile gönderilen her veri paketine frame (çerçeve) denir. Bir UART frame genellikle 4 elemandan oluşur:

  1. Start bit: Alıcıya yeni bir frame gönderilmekte olduğunu bildiren, iletişim başlatma bitidir.
  2. Veri bitleri: Veriyi taşıyan bitlerdir. UART ile veri genelde 8 bitlik kelimeler halinde gönderilir.
  3. Parite biti: Verinin alıcıya sağlam ulaşıp ulaşmadığının kontrolü için kullanılan bittir. Her UART haberleşmesi parite biti içermek zorunda değildir.
  4. Stop bit(leri): İletişimin tamamlandığını belirten bir veya iki bitlik kısımdır.

Yukarıdaki şekilde A aygıtından B aygıtına gönderilecek UART frame aşağıdaki gibidir. Göndericiden ilk çıkan ve alıcıya ilk ulaşan bit start bitidir.

UART haberleşmesinde veri bitleri en önemsiz bitten (LSB) en önemli bite (MSB) doğru sıralanarak gönderilir. Örneğin gönderilecek veri 200 sayısı olsun. 200’ün binary karşılığı 11001000 şeklindedir. Bu durumda UART frame aşağıdaki şekilde olur.

Bir UART haberleşmesinde iletişim hattı idle (boşta) konumundadır. UART iletişimde genellikle idle sinyali lojik 1’dir. Start biti ise lojik 0’dır. Yani sürekli 1 sinyali alınan bir sistemde 0 sinyali alındığı anda iletişim başlamış demektir.

UART ile saniyede gönderilen bit sayısına baud rate denir. Kullanılan mikroişlemci tipine göre baud rate değeri genellikle 9600 ile 153000 arasında seçilir. Haberleşmeye başlamadan önce hem Tx hem de Rx aynı baud rate değerine ayarlanır. Çünkü hatta veri yazan ile okuyan aynı hızda çalışmalıdır. Bu işlem bir saat frekansı ile gerçekleşir. Örneğin baud rate 9600 olan bir sistem için 1 bitin aktarılması 1/9600=104µs (mikrosaniye)’dir. Yani, bir bit okunduktan sonra bir sonraki biti okumak için 104µs beklenir.

Arduino Uno’nun D0 ve D1 pinleri sırasıyla aynı zamanda UART için Tx ve Rx pinleridir. İki Arduino arasında bu pinler kullanarak haberleşme gerçekleştirilebilir. Aşağıdaki örnekte iki Arduino UART ile haberleşmektedir. Bir Arduino’ya bağlı butona basınca diğer Arduino ledi yakmaktadır.

Malzemeler

  • 2 adet Arduino Uno
  • 1 adet push buton
  • 1 adet 10K, 1 adet 220 ohm direnç
  • 1 adet Led

Bağlantı şeması

Bu örnekte gönderici Arduino, butona basılınca UART üzerinden 1 sayısını, basılmayınca 0 sayısını gönderir. Alıcı Arduino ise iletişim hattını dinler, 1 sayısını taşıyan çerçeveyi aldığında ledi yakar, 0 sayısını taşıyan çerçeveyi aldığında ledi söndürür.

Kaynak kod

Gönderici Arduino kodu

void setup() {
  pinMode(7,INPUT); // 7 numaralı pin butona bağlı
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(7) == HIGH)
    Serial.write(1);
  else
    Serial.write(0);
  delay(100);
}

Alıcı Arduino kodu

int durum = 0; // Seri porttan gelen veriyi tutan değişken
void setup() {
  pinMode(7,OUTPUT); // Ledin bağlı olduğu pin
  Serial.begin(9600);
}
void loop() {
  if (Serial.available() > 0) // Seri port açık mı?
  {
    durum = Serial.read(); 
    if (durum == 1)
      digitalWrite(7,HIGH); // Ledi yak
    else
      digitalWrite(7,LOW); // Ledi söndür
  }
  delay(100);
}