UART Protokolü

Gömülü sistemler dünyasında GPS modülleri, hücresel (GSM) aygıtlar, Wi-Fi/Bluetooth adaptörleri veya mikrodenetleyiciler arası temel veri aktarımlarında en sık başvurulan protokollerin başında UART (Universal Asynchronous Receiver-Transmitter) gelir. SPI veya I2C gibi protokollerin aksine, hat üzerinde ortak bir saat (Clock) sinyali barındırmayan bu yapı, sadeliği kadar zamanlama hassasiyetiyle de öne çıkar.

Bu yazıda, UART protokolünün donanımsal altyapısını, paket (frame) yapısını ve asenkron sistemlerde hayat kurtaran Baud Rate / örnekleme mantığını inceliyoruz.

1. UART Donanım Yapısı ve Fiziksel Hatlar

UART, aslında bağımsız bir veri yolu (bus) protokolü değil, mikrodenetleyicilerin içinde yer alan donanımsal bir çevre birimidir. İki cihaz arasında tam çift yönlü (Full-Duplex) haberleşme sağlamak için temelde sadece iki veri hattı ve ortak bir toprak (GND) bağlantısı yeterlidir.

  • Tx (Transmit Data): Veri gönderim hattı. Cihaz-1’in Tx pini, Cihaz-2′ Hillary’s Rx pinine bağlanır.
  • Rx (Receive Data): Veri alım hattı. Cihaz-1’in Rx pini, Cihaz-2’nin Tx pinine bağlanır.
  • GND (Ground): Sinyal seviyelerinin (lojik 0 ve 1) her iki tarafta da doğru yorumlanabilmesi için ortak referans hattıdır. GND bağlantısı olmadan kararlı bir UART iletişimi imkansızdır.

2. Asenkron İletişim ve Baud Rate Nedir?

SPI ve I2C protokolleri senkron çalışır; yani verinin ne zaman okunacağını söyleyen fiziksel bir Clock hattı (SCL/SCLK) vardır. UART ise asenkron bir protokoldür; hat üzerinde harici bir saat sinyali taşınmaz.

Peki, alıcı cihaz gelen bitlerin ne zaman başlayıp ne zaman bittiğini nasıl anlar? İşte burada devreye Baud Rate (Sinyalleşme Hızı) girer.

💡 Baud Rate Kuralları: İletişimin başlayabilmesi için her iki cihazın da saniyede kaç bit aktarılacağı (bits per second – bps) konusunda önceden el sıkışmış olması gerekir. Sektörde yaygın olarak kullanılan standart hızlar 9600, 38400 veya 115200 bps‘tir.

Örnekleme (Oversampling) Mantığı

Alıcı UART, hattı sürekli olarak seçilen Baud Rate hızının genellikle 16 katı (16x oversampling) hızda örnekler. Hat boşta (Idle) iken lojik 1 seviyesindedir. Alıcı, hattın lojik 0‘a düştüğünü gördüğü andan itibaren clock sayacını başlatır ve her bitin tam ortasını (Center Sampling) yakalayarak veriyi hatasız okumaya çalışır. Cihazlar arasındaki saat frekansı farkı %2‘yi aşarsa veri bozulması (Frame Error) meydana gelir.

3. UART Veri Paketi (Frame) Anatomisi

UART üzerinden gönderilen her bir karakter veya veri baytı, belirli bir paket düzenine (Frame) uymak zorundadır. Hat boşta iken sürekli 1 basılırken, transfer süreci şu adımlarla işletilir:

  1. Başlangıç Biti (Start Bit): Hat lojik 1 konumundan lojik 0 konumuna çekilir. Bu 1 bitlik süre, alıcıya yeni bir paketin geldiğini ilan eder.
  2. Veri Çerçevesi (Data Frame): Genellikle 8 bit (1 Bayt) uzunluğundadır (bazı sistemlerde 5 ila 9 bit arası yapılandırılabilir). Veri iletimi standart olarak en düşük anlamlı bitten (LSB – Least Significant Bit) başlar, en yüksek anlamlı bite (MSB) doğru ilerler.
  3. Parite Biti (Parity Bit – Opsiyonel): Basit bir hata kontrol mekanizmasıdır. Tek (Odd) veya Çift (Even) parite olarak ayarlanabilir. Gelen veri bitlerindeki 1‘lerin sayısını sayarak elektriksel gürültüden kaynaklı bir bitlik kaymaları tespit etmeye yarar. Günümüzde yerini daha gelişmiş algoritmalara bıraktığı için genellikle kullanılmaz (None).
  4. Bitiş Biti (Stop Bit): Verinin (ve varsa paritenin) iletimi bittikten sonra hat tekrar lojik 1 seviyesine çekilir ve yapılandırmaya göre 1 veya 2 bit süresince High’da tutulur. Bu, paketin bittiğini ve hattın yeni bir paket için tekrar boşa çıktığını gösterir.

4. Gerçek Dünya Sorun Giderme (Troubleshooting) ve Saha Notları

Sahada UART/Seri haberleşme sorunları yaşıyorsanız, osiloskop veya mantıksal analizör (logic analyzer) bağlamadan önce şu kontrol listesini uygulayın:

  • Baud Rate Çakışması: En sık yapılan hata, iki taraftaki kodlarda farklı Baud Rate tanımlanmasıdır (Örn: Master 115200 iken Slave’in 9600’de kalması). Ekrana anlamsız karakterler (garbage data) basılıyorsa ilk olarak hızları kontrol edin.
  • Tx-Rx Ters Bağlantısı: Tasarım veya montaj aşamasında Tx pini Tx’e, Rx pini Rx’e bağlanmış olabilir. Unutmayın: Tx $\rightarrow$ Rx ve Rx $\rightarrow$ Tx olmalıdır.
  • TTL vs RS-232 Voltaj Farkı: Mikrodenetleyicilerin UART birimleri genellikle $0\text{-}3.3\text{V}$ veya $0\text{-}5\text{V}$ (TTL seviyesi) ile çalışır. Endüstriyel cihazlar veya eski bilgisayarlar ise $-15\text{V}$ ila $+15\text{V}$ arasında çalışan RS-232 standardını kullanır. TTL seviyesindeki bir mikrodenetleyiciyi doğrudan RS-232 hattına bağlamak işlemcinin UART birimini kalıcı olarak yakacaktır. Arada mutlaka MAX232 veya benzeri bir seviye dönüştürücü entegre kullanılmalıdır.
  • Mesafe Sınırı: UART (RS-232/TTL), diferansiyel hatlar (RS-485 gibi) gibi gürültü bastırma yeteneğine sahip değildir. Bu nedenle hat boyu uzadıkça parazit kapma riski çok yüksektir. TTL seviyesinde güvenli mesafe birkaç metreyi geçmemelidir.

Görseldeki dalga şekli (waveform) üzerinden, UART paket yapısını ve bitlerin hat üzerinde zamansal olarak nasıl aktığını adım adım inceleyelim.

UART haberleşmesinde sinyalin voltaj seviyeleri için iki temel terim kullanılır:

  • High Voltage (“Mark”) = 1: Hattın yüksek voltajda ($3.3\text{V}$ veya $5\text{V}$) olduğu ve mantıksal 1 değerini taşıdığı durumdur.
  • Low Voltage (“Space”) = 0: Hattın sıfır voltaj (GND) seviyesine indiği ve mantıksal 0 değerini taşıdığı durumdur.

Şemadaki örnek dalga formunun bit bazlı anatomisi şu şekildedir:

1. Boşta Durumu (Idle)

Veri iletimi başlamadan önce hat Idle (Boşta) durumundadır. Grafiklerin en solunda gördüğünüz gibi, hat sürekli olarak High (“Mark”) = 1 seviyesinde tutulur. Bu, hattın kopmadığını ve sistemin sağlıklı çalıştığını gösteren elektriksel bir güvencedir.

2. Başlangıç Biti (Start Bit)

Haberleşmeyi başlatacak olan verici (Tx), hattı ani bir kararla 1 bitlik süre boyunca Low (“Space”) = 0 seviyesine çeker (şemadaki taralı gri alan). Alıcı (Rx), bu düşen kenarı (falling edge) yakaladığı anda zamanlayıcısını (baud rate sayacını) başlatır ve “Yeni bir paket geliyor, örneklemeye başla” talimatını alır.

3. Veri Bitleri (Data Bits)

Başlangıç bitinden hemen sonra asıl taşınmak istenen veri baytı hatta basılır. UART protokolünde veri iletimi standart olarak en düşük anlamlı bitten (LSB) başlar, en yüksek anlamlı bite (MSB) doğru gider.

Şemadaki lojik dalga formunu soldan sağa doğru okursak:

  • 1. Bit: High (1)
  • 2. Bit: High (1)
  • 3. Bit: Low (0)
  • 4. Bit: Low (0)
  • 5. Bit: High (1)
  • 6. Bit: Low (0)
  • 7. Bit: High (1)
  • 8. Bit: Low (0)

Yani hattan akan ham veri dizilimi soldan sağa 11001010 şeklindedir. Bunu tersine çevirip (MSB’den LSB’ye) gerçek fonksiyonel ikilik değere dönüştürdüğümüzde, taşınan veri 01010011 (Hex karşılığı 0x53, ASCII karşılığı ise S harfi) olur.

4. Parite Biti (Parity Bit)

Veri bitlerinin hemen ardından gelen, hata kontrolü amacıyla kullanılan opsiyonel bittir. Şemadaki örnekte Çift Parite (Even Parity) kullanılmıştır.

  • Mantık şudur: Veri bitlerinin içindeki 1‘lerin sayısı sayılır. Bizim verimizde (11001010) toplam 4 adet 1 vardır.
  • 4 zaten çift bir sayı olduğu için, parite biti toplamı çift tutmak adına 0 (Low) olarak basılmıştır (şemadaki turuncu alan).
  • Eğer 1‘lerin sayısı tek olsaydı, parite biti 1 yapılarak toplam çift sayıya tamamlanacaktı. Alıcı bu biti sayarak yolda bir bitin gürültüden dolayı tersine dönüp dönmediğini anlar.

5. Bitiş Biti (Stop Bit) ve Tekrar Boşta (Idle)

Paketin tamamlandığını belirtmek için hat yeniden High (“Mark”) = 1 seviyesine çekilir (şemadaki sağdaki taralı gri alan). Yapılandırmaya göre 1 veya 2 bit süresince hat High’da kalır. Bu süreç tamamlandıktan sonra, eğer arkadan gelecek yeni bir paket yoksa hat yeniden Idle (kesintisiz lojik 1) durumuna geri döner ve bir sonraki Başlangıç Biti düşüşünü beklemeye başlar.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir