Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

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.
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.
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.
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.
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 konumundan lojik 0 konumuna çekilir. Bu 1 bitlik süre, alıcıya yeni bir paketin geldiğini ilan eder.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).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.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:
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:
1 değerini taşıdığı durumdur.0 değerini taşıdığı durumdur.Şemadaki örnek dalga formunun bit bazlı anatomisi şu şekildedir:

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.
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.
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)1)0)0)1)0)1)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.
Veri bitlerinin hemen ardından gelen, hata kontrolü amacıyla kullanılan opsiyonel bittir. Şemadaki örnekte Çift Parite (Even Parity) kullanılmıştır.
1‘lerin sayısı sayılır. Bizim verimizde (11001010) toplam 4 adet 1 vardır.0 (Low) olarak basılmıştır (şemadaki turuncu alan).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.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.