Jump to content
şenol eker

İki mikrodenetleyici arasında haberleşme

Önerilen İletiler

şenol eker    0

İki mikrodenetleyici arasında haberleşme konusunda çok fazla "sıkıntı" çekildiğini görüyorum. Bu yüzden bu makaleyi yazmaya karar verdim.

Haberleşme isterse iki kıta arasında olsun isterse aynı pcb üzerindeki iki çip (PIC/AVR/STM) arasında olsun, haberleşmedir. ADSL modemden Wi-Fi'ye hatta modern telefon görüşmelerine kadar, tüm haberleşme "paketler" halinde yapılır. Çünkü en kolay ve düzgün olanı bu.

"Paket" dediğimiz adı üstünde, bir bütün. Peki neden bilgileri buradan ard arda gönderip karşıdan da ard arda almıyoruz?
Örneğin:
Birinci_mesaj
İkinci_Mesaj
3_Mesaj
Bunları ard arda gönderirsek, her bir mesajın nerede başlayıp nerede bittiğini bilemeyiz. Bu yüzden her bir mesajın başına / sonuna bir "işaret" koymalıyız. Örneğin işaret olarak * koymayı düşünelim.
Peki, mesajın içinde * varsa ne olacak?
Biz verileri doğrudan gönderiyorsak, her bir byte 0 ile 255 arasında değer alabilir. Dolayısı ile "başka amaçla kullanılmayan" diye bir şey yok. (ESC ile bu mümkün ama kafamızı karıştırmayalım; yolu yok diyelim) O halde nasıl ayıracağız bu mesajları?
Cevap, "paketleyerek". (packet)
Cevap, "zarfa koyarak", (envelope)
Cevap, "çerçeveye koyarak" (frame)
Öncelikle bir "protokol" kurmalıyız kafamızda. Protokol dediğimiz, neyi nasıl yapacağımızın tarifi.
Örnek olarak bir protokol uyduralım:
En başta bir "preamble" olsun. Paketin buradan başladığını biliriz. Preamble 0x55 0xAA olsun örneğin. (Bu sayının seçilme sebebi, binary olarak 01010101 10101010 şeklinde olması, bir ve sıfırlar ardışık)
Ardından yükümüzün (payload) kaç byte olduğunu verelim. Sabit bir şey göndereceksek buna gerek olmayabilir.
Sonra asıl göndereceğimiz veri. Yani "payload", yük.
En sonda da istersek bir kontrol toplamı (CRC) gönderebiliriz. Bir terslik olursa hatalı veri alınmasın diye.
Evet, "çerçeve"mizin yapısı bu olacak. Şimdi bunu yazalım da güzel görünsün:
 

Byte  İçerik        açıklama
00    0x55          Preamble ilk byte
01    0xAA          Preamble 2. byte
02    len           yük uzunluğu
03    payload(1)    yük
..    payload(..)   yük
len+2 payload(len)  yük son byte
len+3 CRC           yük CRC toplamı

Tabii bu bir kural değil. CRC koymayabiliriz örneğin, eğer aradaki iletişim çok sağlıklı ise ve hatalı bilgi gitmesi sistemimizde büyük sıkıntıya yol açmayacaksa. Çünkü pakete ilave edeceğimiz her byte, iletişim hızımızı düşürecek.

Örneğin uzunluğumuz sabit olabilir. O zman onu da kullanmayabiliriz. Örneğin 16 bitlik bir integer sayı gönderiyor olabiliriz. Bu durumda uzunluk sabittir. Verinin çok hızlı olmasını istiyorsak, örneğin preamble de 1 byte olabilir. Bu durumda paketimiz şöyle olacak:

Byte İçerik Açıklama
00   0x55   Preamble
01   yük-1  Yükün büyük byte'ı
02   yük-2  Yükün küçük byte'ı

Sonraki gönderide verinin nasıl gönderilebileceğine bakacağız.

(Devam Edecek)

İletiyi paylaş


İletiye bağlantı
Sitelerde Paylaş
Misafir
Bu konu kapalıdır ama konuya cevap yazmaya yetkiniz var görünüyor.

×
×
  • Yeni Oluştur...

Önemli Bilgilendirme

Facebook / Twitter / Google hesabınızla kolayca kaydolup cevap verebilir, soru sorabilir, istekte bulunabilirsiniz.
Devam etmeniz, forum kurallarını kabul ettiğiniz anlamına gelir.            Forum Kuralları