30 Kasım 2018 Cuma

ASENKRON SERİ HABERLEŞME LAMBA VE KLİMA OTOMASYON UYGULAMASI

Asenkron Seri Haberleşme Lamba ve Klima Otomasyon Uygulaması

Bu yazımızda bir otomasyon uygulaması yapacağız. Bunun diğer programlardan farkı seri ekrandan bir komut gireceğiz ve her komutun Orange pi üzerinde yapacağı bir işlem olacak. 

Daha önceki yazılarda genelde yapmak istediklerimizi '1', '2' gibi gibi isimlendirip kullanıcılardan bu kategori sırasına göre bir giriş yapmasını istiyorduk. Bu uygulamada kullanıcıdan yapmak istediği işlem için belirlediğimiz komutları girmesini isteyeceğiz. Lambanın yanması için kullanıcının bizim belirlediğimiz "lambayak" gibi bir komut girmesi lazım. 

Bu aşamada önceki programlarda kullandığımız kullanıcıdan veri alma ve veri gönderme bilgimizi kullanacağız fakat burada ek olarak bir kaç işlem daha uygulayacağız.


Program kodlarının yazmaya başlayalım. Kütüphane olarak burada yapacağız işlemler için gerekli olan serial, time, gpio, port kütüphanelerini ekliyoruz. Daha sonra kullanacağız pinlere program içinde kolaylık olsun diye isim atıyoruz. Ledi "PC4" fanı ise "PD14" pinine bağlamayı düşündüğümüz için bu şekilde bir atama yapıyoruz. Daha sonra kullanacağımız pinler birer çıkış pini olacağı için "gpio.setcfg()" ile pin giriş/çıkış durumunu ayarlıyoruz.

Seri haberleşme parametrelerini tanıttıktan sonra hem seri ekrana hem de Orange pi terminal ekranına programın başladığına dair bir yazı yazdırdıktan sonra program içinde kullanılacak komutları, kullanıcıya bildirmek için seri ekrana yazdırıyoruz. Siz bu komutları çeşitlendirebilir, sadeleştirebilirsiniz.


Burası aslında bu programın daha teorik olan kısmı. Kullanıcıdan bir veri almamız lazım. Bu veri string veri tipinde ve boyutu belli değil. Normalde ser.read(n) ile belirli sayıda karakterde veri alabiliyorduk fakat burada girilecek komutların hepsi aynı uzunlukta değil. Bu yüzden tek seçeneğimiz ve bu da "ser.readline()".

Bu komutu daha önce yaş-burç uygulamasında kullanmıştık.Bahsettiğim uygulamada doğum tarihini ay-gün şeklinde alırken "readline()" ile almış ve bunu "int(secenek)" ile sayıya dönüştürüp devam etmiştim ve bir sıkıntı çıkmamıştı. Örneğin ben seri ekranda '123' girip enter'a tıkladığımda bu veri Orange pi'ye '123Enter' diye gelir.  Bunu aldığımız veriyi binary formatına dönüştürüp ekrana yazdırdığımızda rahatça görürüz. Sonrasında ben gelen bu veriyi integer veri tipine dönüştürdüğümde 'enter' karakteri atılır ve geriye '123' sayısı kalır. Bu işlemi yaparken bir sorun çıkmaz. Bunu koda çok küçük bir ekleme yapıp görelim.


Koda aldığımız verinin binary halini ve sayı halini ekrana yazdıran 2 satır kod ekledim.


Burada da gördüğünüz gibi '1', '2' ve '3' karakterlerinin yanı sıra iki karakter daha gelmiş. Bunlar enter'a bastığımız için gelen karakterler. Yukarıda enter karakteri dedim fakat enter iki karakteri temsil eder. Buna bilgisayarda kullanabileceğimiz seri arayüz programları yazısında detaylıca değindim. Kısaca enter'a bastığımızda Orange pi'ye veri olarak CR(13-1101) ve LF(10-1010) gelir. Bunun sebebi windows'da satır sonu bu şekilde belirtiliyor. Biz gelen veriyi sayı formatına dönüştürdüğümüzde bu karakterler atılıyor fakat veriyi string(karakter dizisi ) veya karakter formatında kullanırsak enter karakterini de göz önünde bulundurmak gerekiyor.

Gelen veriyi bir string(karakter dizisi) ile karşılaştıracaksak 'enter' ile gelen karakterleri de göz önünde bulundurmak gerekiyor. Bunun için karşılaştırma yapacağımız verilerin sonuna "\r\n" eklemesi yaparız.  Burada "\r" ifadeyi satır başına döndürür yani CR işlevi görür. "\n" ise bir alt satıra indirir bu da LF işlevi görür.


Koda sadece gelen veriyi binary haline döndürmek için ekleme yapıp  Orange pi'ye gelen veriyi görelim.


Yukarıdaki görüntüden program çıktısına bakarsak bir veri girip enter'a tıkladığımızda(ser.readline() ile veri aldığımız için ) son iki karakterin enter karakteri olduğunu görürüz.

Bu yüzden alınan veri ile istediğimiz bir karakteri karşılaştırma yaparken bu karakterin sonuna "\r\n" ekleriz. Örneğin girilen veriyi "lambayak" ile karşılaştırmak için; if secenek =='lambayak\r\n' diye kodlamak gerekiyor.

Bu şekilde istediğimiz komutları if yapısında karşılaştırarak ayarlayabiliriz. Daha sonrasında her komut için yapılması gereken işlemleri if bloğuna yazabilirsiniz.

 

Son olarak hem seri ekrana hem de Orange pi terminaline kullanıcıya kolaylık sağlamak için Orange pi çıkışlarının durumunu yazdırıyoruz. Burada pin okumak için "gpio.input(pin ismi)" kullanıyoruz. 

Bu şekilde lamba ve klima için 4 farklı durum olabilir. Lamba açık klima kapalı, lamba açık klima açık, lamba kapalı klima açık ve lamba kapalı klima kapalı. Her bir durum için ekrana toplu durum çıktısı yazdırıyoruz.


Yukarıdaki görüntüye bakarak programın nasıl ilerlediğini görebilirsiniz.

Okuduğunuz için teşekkür ederim. Aklınıza takılan bir soru veya karşılaştığınız bir sorun olduğunda yorumlarda belirtebilirsiniz. Burada eksik olarak anlattığımı düşündüğünüz veya sizlerin gerekli olarak gördüğünüz bilgileri yine yorumlarda yazarsanız, bundan herkesin faydalanmasını sağlamış olursunuz. Herkese iyi çalışmalar.

29 Kasım 2018 Perşembe

ASENKRON SERİ HABERLEŞME İLE FAN KONTROLÜ

Asenkron Seri Haberleşme ile Fan Kontrolü

Bu yazımızda asenkron seri haberleşme ile bilgisayardan aldığımız verilerle Orange pi'ye bağladığımız "led" ve "fan"ı kontrol edeceğiz. 

Bu öğretici seriye başlayıp haberleşmenin teorik kısmını anladıktan sonra öğrendiklerimizi bir de örnek uygulamalarla beraber kullanmamız gerekiyor. Bunun için şu anlık "python" ve "c" üzerine örnek uygulamaları göreceğiz ve kendimiz bu uygulamalara ekstra bir şeyler eklemeye çalışacağız. 

İlk aşamada "python" ile seri haberleşme nasıl yapılıyor, ne bilmemiz gerekiyor bunlara değindik. Sonra elimizdeki örnek kodu ve python'daki kodlama bilgilerini kullanarak bu örnek uygulamaları zenginleştirmeye çalıştık. 





Örnek uygulamada seri ekrandan girilen belirlediğimiz verilerde Orange pi terminal ekranına bir şey yazdırdık. Sonrasında yaş-burç uygulamasında seri ekrandan girilen verileri birden fazla karakter(string) olarak aldık ve bu verileri kullanarak tekrar seri ekrana bir veri yazdırdık. Sonrasında seri ekrandan alınan veri ile Orange pi çıkış pinini kontrol ettik. 

Bu yazıda fan kontrolü için yine bir pini kontrol edeceğiz fakat sadece bu pini kontrol etmek fanı döndürmek için bize yeterli olmayacak. Burada ekstra olarak transistör kullanımını da göreceğiz ve bunu projemizde uygulayacağız.

Elimizde üzerinde 12 V yazan bir fan var ve biz bunu döndürmek istiyoruz. Tabi bu 12 V' a kadar besleme yapabiliriz demek. Biz de bunu direk Orange pi pinine bağlıyoruz ve bu pini '1' konumuna getirdiğimizde fanın çalışmadığını ya da çok yavaş döndüğünün görüyoruz. Buna sebep pin çıkış geriliminin 3 V - 3.3 V olması ve çıkış akımını düşük olması gösterilebilir. Direk 5 volta bağlasak bu sefer de kontrol edeyeceğiz. Fan sürekli döner. Bu yüzden kullanımı da yaygın olan "S0850 NPN" transistörünü kullanacağız.


İlk önce kullanacağımız transistörü biraz inceleyelim. Biz burada "S0850 NPN" transistörünün akım yükseltme ve anahtarlama özelliğini kullanacağız.

Temel olarak 2 tip transistör vardır. Bunlar BJT ve MOSFET transistörler. Bizim kullanacağımız transistör BJT tipi  NPN transistördür ve genel olarak transistörlerin 3 bacağı olur.  BJT tipinde bu bacaklar yayıcı(emitter), baz(base) ve toplayıcı(collector) bacaklarıdır.  

NPN transistörleri açık konuma geçirmek için baz(base) kısmından pozitif akım geçmeli. Buna ikinci geilim kaynağı diyoruz. İlk gerilim kaynağının artısı ise fana(yüke), fandan da toplayıcıya(collector) bağlanır.

Base gerilimi bizim Orange pi piniden çıkan gerilim olacak. Fana bağlanacak gerilim ise Orange pi üzerindeki 5 V pinidir.

Yukarıda gördüğünüz gibi toplayıcı(collector) 500 miliampere kadar akım çekebilir.

Bağlantımız ise şu şekilde olacak. 

  

Base bacağını kontrol edeceğimiz Orange pi pinine bağlayacağız. Bu pin aslında devrenin anahtarı konumda. Eğer biz bu pine '1' vermezsek devrede fan dönmez.

Yapacağımız uygulamanın ikinci kısmında ise yine led kontrolü yapacağız. Bunun için detaylı bilgiye bir önceki yazıdan bakabilirsiniz.


Bu programda yine 2 seçeneğimiz var ve bu seçeneklerden ilk 1 saniye aralıklarla ledin yanması. Diğer bir seçenek ise fanı döndür seçeneği. Programdan sürekli bu ikisinden birini seçme hakkın olsun diye  olsun diye bu işlemlerim süresini sınırlıyoruz. Ledin yanma sönme durumu ve fanın dönmesini 10 saniyeye ayarlıyoruz. Böylece bir işlem bittiğinde bize tekrar led mi fan mı diye sorsun.


Eğer kullanıcı seri ekrana '2' girerse fanı kontrol ettiğimiz transistörün baz bacağına pozitif bir gerilim uyguluyoruz ve böylece fan çalışmaya başlıyor. 10 saniye sonra bu pini sıfırladığımızda fan duruyor.

Else durumunda kullanıcıya "sadece 2 kategorimiz vardır" ve "lütfen bir kategori seçiniz" dedikten sonra bu döngüden çıkıp tekrar bir alttaki mesajı da yazmasın diye burada continue kullanıyoruz. Böylece program döngü başına geliyor ve bizden tekrar bir giriş bekliyor.



Yukarıdaki görüntüye bakarak programın nasıl ilerlediğini görebilirsiniz.
Led ve fanı kontrol edebildiğimize göre bir sonraki yazıda küçük bir otomasyon programı yazacağız. Bu sefer işlemlerimizi string komutlar halinde seri ekrana yazacağız. Örneğin "ledyak" gibi. Bu tarz komutlar belirleyip programı ona göre yönlendireceğiz. Her program döngüsünde ekrana kontrol ettiğimiz çıkışların son durumunu yazdırarak kullanıcının güncel durumu görmesini sağlayacağız. Programı çalıştırdığımızda bir giriş parolası isteyeceğiz. Bu şekilde basit ama temel bir kaç ekleme yapacağız.

Okuduğunuz için teşekkür ederim. Aklınıza takılan bir soru veya karşılaştığınız bir sorun olduğunda yorumlarda belirtebilirsiniz. Burada eksik olarak anlattığımı düşündüğünüz veya sizlerin gerekli olarak gördüğünüz bilgileri yine yorumlarda yazarsanız, bundan herkesin faydalanmasını sağlamış olursunuz. Herkese iyi çalışmalar.

Kaynakça:

28 Kasım 2018 Çarşamba

ASENKRON SERİ HABERLEŞME İLE LED KONTROLÜ

Asenkron Seri Haberleşme ile Led Kontrolü

Bir önceki yazıda asenkron seri haberleşme ile bilgisayardan girdiğimiz verileri kullanabileceğimiz bir python programı yazmış ve bu programı incelemiştik. Bu program alınan verilere göre çıkan sonuçları, verileri orange pi ekranına ve seri ekrana yazıyordu.

Bu yazıda asenkron seri haberleşmeyi kullanarak bilgisayardan girdiğimiz bir veri ile Orange pi üzerindeki pinleri kontrol edeceğiz. Bu programı python ile yazacağız ve hem python ile seri haberleşme hem de python ile giriş çıkış pinlerinin kontrolü konularına değineceğiz. 

Gerekli malzemeler:
-Orange Pi
-USB to TTL
-Led
-110 ohm direnç

Bu yazıda inceleyeceğimiz programda, ledi kontrol ederek iki farklı şekilde yanması için seri ekrandan komutlar gireceğiz. Bu led yanma durumlarından biri "1 sn aralıklarla ledin yanması" diğeri ise "flash led".


Yukarıda bağlantı şeklimizi görebilirsiniz. Burada ledin artı bacağını bir 110 ohm'luk dirençle birlikte "PA12" portuna yani Orange pi "3." pinine bağlıyoruz. USB to TTL modülümüzün TTL kısmında "Rx" ve "Tx" pinlerini UART1(ttys1 portu) pinleri olan Orange pi "38." ve "40." pinlerine bağlıyoruz. GND kısmını ise Orange pi "6." pinine bağlıyoruz.

Python'da Orange pi pin isimlerine aşağıdaki görselden bakabilirsiniz.



Kod kısmına geçecek olursak bir önceki yazdığımız program olan "yaş-burç uygulaması"na bakabiliriz. Kullanıcının seri ekrana gireceği karakteri alıp belirtilen kategorideki işlemi gerçekleştireceğiz. Fakat bu işlemler pin kontrolü işlemi olduğu için programa ekleme yapmamız gereken birkaç kütüphane var.

from pyA20.gpio import gpio
from pyA20.gpio import port



"gpio.init()" ile giriş çıkış pin işlemlerini başlatıp kullanacağımız pine bir isim verdikten sonra bu bini çıkış olarak tanımlarız.

Seri haberleşme için haberleşme parametrelerini tanımladıktan sonra artık programın ne yapacağını kodlayabiliriz.



Seri ekrana yazdırdığımız bilgilendirici yazıdan sonra kullanıcıdan bir seçim yapmasını istiyoruz ve kullanıcının girdiği karakteri "secenek" değişkenine atıyoruz.



Kullanıcı '1' i girmişse ledi 20 saniye boyunca(10 tur)  bir saniye aralıklarla yanıp söndürmek için "gpio.output(pin , durum)" fonksiyonunu kullanıyoruz. Burada programın o an için ne yaptığını da seri ekrana yazdırıyorum ki programı test ederken veya ekran görüntüsü ile sizlere bir şey aktarırken ledin durumunu size aktarabileyim.



Kullanıcı '2' yi girmişse ledin  10 saniye boyunca(50 tur) hızlı bir şekilde yanıp sönmesi için  "gpio.output(pin , durum)" fonksiyonunu kullanıyoruz.  Aynı şekilde ledin o anki durumu seri ekrana yazılır.

Eğer bu iki seçenekten biri seçilmemişse program uyarı mesajı verir ve tekrar başa döner.



Yukarıdaki görüntüye bakarak programın nasıl ilerlediğini görebilirsiniz.

Kodun tamamına   https://github.com/koksalkapucuoglu/asenkron_seri_haberlesme/blob/master/led_kontrol.py deposundan ulaşabilirsiniz.



Bu basit yapıyı kullanılarak ledin yapacağı işlemler çeşitlenebilir, birden fazla pin kontrol edilebilir. Bir sonraki yazıda asenkron seri haberleşme ile fan kontrolünden bahsedeceğim. 12 voltluk bir fanı nasıl kontrol edebiliriz? Eksta olarak bir şeye ihtiyacımız var mı gibi soruları da cevaplandırmış olacağız.

Okuduğunuz için teşekkür ederim. Aklınıza takılan bir soru veya karşılaştığınız bir sorun olduğunda yorumlarda belirtebilirsiniz. Burada eksik olarak anlattığımı düşündüğünüz veya sizlerin gerekli olarak gördüğünüz bilgileri yine yorumlarda yazarsanız, bundan herkesin faydalanmasını sağlamış olursunuz. Herkese iyi çalışmalar.

27 Kasım 2018 Salı

ASENKRON SERİ HABERLEŞME İLE PYTHON YAŞ-BURÇ UYGULAMASI

Asenkron Seri Haberleşme ile Python Yaş ve Burç Uygulaması

Asenkron seri haberleşmenin genel mantığını ve işleyişi ile alakalı bilgilerden sonra seri ekrana veri yazma, seri ekrandan veri okuma komutlarını öğrenmiştik. Bu komutları kullandığımız örnek bir kodu incelemiştik. Şimdi bu kodlar ile alternatif programlar yazacağız.

Şuan asenkron seri haberleşmeyi "python" kodu ile yapıyoruz. Bir sonraki aşamada "c" kodu ile asenkron seri haberleşme nasıl başlar, nasıl veri göndeririz gibi konuları inceleyeceğiz. Şuan "python"da bir kaç alternatif uygulama yaparak farklı veri tiplerinin gönderilmesi ve okunması, okunan veri ile led, fan kontrolü gibi uygulamalar yapacağız.

Asenkron seri haberleşmede alıcı verici arasında gönderilen veya alınan tüm veriler karakter şeklindedir. Eğer sayılarla veya farklı veri tipleriyle uğraşmak istiyorsak alınan veriyi alındıktan hemen sonra başka bir veri tipine dönüştürüp aynı şekilde göndermeden de hemen önce elimizdeki veriyi karaktere dönüştürüp uygulamalarımızda sorunsuz bir şekilde ilerleyebiliriz.

Geçelim bu yazının ana konusu olan yaş ve burç programına. Bu program çalıştırdığımızda kullanıcıya iki seçenek sunsun. Bu seçenekler "yaş hesaplama" ve "burç öğrenme" olsun. Daha sonra seçilen kategoriye göre bizden doğum tarihimizi veya doğduğumuz ay ve gün bilgisini istesin. Daha sonra sonuçları ekrana yazsın ve program sürekli olarak dönsün.



Gerekli kütüphaneleri tanımladıktan sonra haberleşme parametrelerini de tanımlıyoruz. Daha sonra seri ekrana "yas hesaplama" için '1', "burç öğrenme" için '2'yi girmesi gerektiğine dair bilgilendirici bir mesaj yolluyoruz. Aynı anda bulunduğumuz cihazda da "seri haberleşme başlıyor" diye bir mesaj yazmasını istiyoruz.



"While" ile programın sürekli dönmesini tanımladıktan sonra kullanıcıdan bir kategori seçmesi isteniyor. Seri ekrandan girilen '1' veya '2' karakter olarak alınıp "secenek" değişkenine atanıyor.

"secenek" değişkeninin '1' olması durumunda bulunduğumuz cihazda seçilen kategori bilgisi yazdırılıyor. Daha sonra kullanıcıdan doğum yılını girmesi isteniyor. Doğum yılı bilgisi "yil" değişkenine atanacak. Burada seri ekrandan girilen verinin alınması için "ser.read(4)" kullandık. Bu kod '4' karakter girdiğimizde okuma işini durdurur ve bu 4 karakteri alır. Doğum yılı dört basamaklı olacağı için bu şekilde bir okuma yapmak bizim için uygun. Fakat "space" ve "silme" tuşları da bir karakter ifade ettiğinden doğum yılını girerken yanlış bir şey yazdığınızda bunu silmek için uğraşmayın. Program sürekli çalıştığından bir sonrakinde doğum tarihimizi doğru girerek doğru sonucu öğrenebiliriz.

Doğum yılı "yil" değişkenine atandığında bu veri "string(karakter dizisi)" veri tipinde. String veriyi "integer(tam sayı)" formatına dönüştürmemiz gerekiyor. Bunun için "int(yıl)" dönüşümünü kullanıp doğum tarihinin integer formatını "intyil" değişkenine atıyoruz. Sonra yaşı bulmak için gerekli işlemi yapıyoruz. Şuan bulduğumuz yaş integer tipinde. Bu veriyi string formatına dönüştürmek için "str(yas)" dönüşümünü kullanırız. İlk kısım bu kadar.



"secenek" değişkenin '2' olması durumunda bulunduğumuz cihazda seçilen kategori bilgisi yazdırılıyor. Daha sonra kullanıcıdan doğum tarihini ay-gün bitişik olarak girmesi isteniyor. Bu şekilde istenmesinin sebebi alınan veriyi daha kolay bir şekilde işlemek.

Veri okunurken "ser.readline()"kullanılıyor. Çünkü bazen girişlerde  26 Ağustos tarihi  "0826" yerine "826" şeklinde de girilebilir. Bu yüzden "ser.readline()" kullanıyoruz. Doğum tarihini girdikten sonra "enter"a basmamız gerekiyor, yoksa "ser.readline()" sürekli okumaya devam eder.

Okuduğumuz bu veriyi "tarih" değişkenine atıyoruz. Şuan "tarih" değişkeni string formatında. Bu veriyi integer forma dönüştürmek için "int(tarih)" dönüşümünü kullanıyoruz ve bunu "inttarih" değişkenine atıyoruz. Sonrasında burçlarına neye göre belirlendiğiyle alakalı bir algoritma kuruyoruz.  Bu algoritma sadece "if" yapılarından oluşuyor. Örneğin, 23 Ağustos ile 22 Eylül arası doğanlar başak burcu oluyor. Eğer ay bilgisini başa getirirsek ki kullanıcıdan bu bilgiyi alırken böyle istedik. Başak burcu 08.23 ile 09.22 arasındakiler oluyor. Böylece her burç için artan sayısal sistemde bir formül yakalamış olduk. Bu formüle göre her sayı aralığını ilgili burca yönlendirmek için "if"yapısını kullanıyoruz.



Doğum tarihine göre bulduğumuz burçları "burc" değişkenine direk string olarak atadığımız için sonucu ekrana yazdırırken bir veri tipi dönüşümü yapmıyoruz.

Eğer verilen kategorilerden biri seçilmemişse bir uyarı mesajı yazılıyor ve program başa dönerek tekrardan bir kategori seçmesi isteniyor.





Programın çalışması bu şekilde. Şuan için iki kategori belirledik fakat bu kategoriler genişletilebilir. Daha sonra kullanıcıdan aldığımız verilerle kullanıcıya pek bir şey sunmadık fakat yine bu işlemler artabilir. Örneğin burç öğrenme kategorisinde girilen bilgilere göre ekrana o burçla alakalı haftalık yazılar yazılabilir. Girilen doğum tarihi bilgisine göre aynı tarihte doğmuş önemli şahsiyetlerin veya o tarihte olmuş önemli olayla yazdırılabilir.

Kodun tamamına https://github.com/koksalkapucuoglu/asenkron_haberlesme/blob/master/yas_burc.py github deposundan ulaşabilirsiniz.

Okuduğunuz için teşekkür ederim. Aklınıza takılan bir soru veya karşılaştığınız bir sorun olduğunda yorumlarda belirtebilirsiniz. Burada eksik olarak anlattığımı düşündüğünüz veya sizlerin gerekli olarak gördüğünüz bilgileri yine yorumlarda yazarsanız, bundan herkesin faydalanmasını sağlamış olursunuz. Herkese iyi çalışmalar.

26 Kasım 2018 Pazartesi

PYTHON SERİ HABERLEŞME HATA BULMA PROGRAMI

Asenkron Seri Haberleşmede Parametre Hatası Bulma

Önceki  yazılarımızdan birinde asenkron seri haberleşmenin düzgün gerçekleşebilmesi için gerekli olan haberleşme parametrelerinden bahsetmiştim. Bunlar "baud hızı", "veri uzunluğu", "başlangıç,bitiş ve eşlenik(parity) biti" parametreleriydi. Bu parametrelerin asenkron seri haberleşmenin gerçekleştiği cihazlarda aynı olması gerekiyordu. Eğer farklı olursa alınan veri düzgün olmazdı.

Bunlardan bahsettiğim yazıda ayrıca bu parametrelerin farklı olduğu durumlarda gönderilen ve alınan verileri inceledik ve bu hataları irdeledik. Bozuk verileri de anlamlandırmış olduk.

Bu yazıda,  haberleşme parametrelerin farklı olmasının sonucunda gönderilen ve alınan veri arasındaki farklılığa bakacağız ve önceki yazılarda elde ettiğimiz sonuçları kullanarak bir program yazacağız. Bu programı pythonda örnek kod olarak kullandığımız bir programın üstüne yazacağız.



Örnek kodumuz yukarıdaki görüntüde görebileceğiniz şekildedir. Program çalıştırıldığında seri ekrandan girdiğimiz karakter 'y' olursa ana cihazdaki ekrana(burada Orange pi) "yes denildi" yazılır; aynı şekilde 'n' girilirse "no denildi" yazılır. Eğer bu iki karakterden farklı bir karakter girilirse ekrana bir uyarı yazısı yazılır ve daha sonrasında yeniden kullanıcıdan bir karakter girmesi istenir ve döngü bu şekilde devam eder.

Eğer ki iki cihaz arasındaki tüm parametreler düzgünse ve kodda bir hata yoksa biz seri ekrandan 'y' veya 'n' karakterini girdiğimizde program bizi ilgili kısma götürür. Fakat 'y' ve 'n' karakterlerinin girmemize rağmen program farklı bir çıktı veriyorsa ya kodda bir hata vardır ya da alınan veri hatalıdır.

Koda bakıp kodun hatalı olmadığını anladığımızda verinin hatalı olduğu kanısına varıyoruz. Yukarıda bahsettiğim, herhangi bir  parametrenin  faklı olması durumda alınan veya gönderilen veride ne gibi bir değişiklik oluyor bunları incelediğimiz için bu inceleme sonuçlarını programa dahil etmemiz gerekiyor. Yani biz hatalı çalışan bir programda çıktı olarak verilerin hatalı gelmesinin sebebini yazdıracağız.

Verinin hatalı gelmesinin sebebi ile ilgili kod eklemeleri  "else" kısmından sonrasına yazılacak ve hatalı veri burada işlenip hata sebebi çıktı olarak yazılacak.

Aslında buna benzer bir programı daha önce haberleşme parametrelerini anlattığım yazıda  yazdım. O program sadece veri uzunluğunun bilgisayarda "7 bit" Orange pi'de ise "8 bit" belirtilmesi durumda amaca uygun çalışıyordu. Program çalıştırıldığında veri uzunluğu farkında dolayı verinin nasıl geleceğini bulup , bu tarz bir hata olmasaydı veri nasıl gelirdi onu yazdırıyorduk.

Veri uzunluğunun pc:orange pi = 7:8 olması durumunda yanlış veriden doğru veriyi nasıl elde ettiğimizi ve veri paketlerini nasıl incelediğimizi "UART ile Haberleşme ve Haberleşme Parametreleri" yazısında görsellerle detaylıca anlatmışım.

Geri kalan haberleşme parametrelerinin  her iki cihazda da farklı olmasının sonucunda olabilecek hataları bu yazıda biraz daha detaylı örnekleyip inceleyeceğiz.

1)Baud hızının iki cihazda farklı olması

a)Baud hızının seri bağlantı kurduğumuz cihazda daha fazla olması durumunda 

Baud hızı-oranı(baud rate)  bir saniyede gönderilen bit sayısıdır. 1/(baud hızı)  bize bir bitin ne kadar sürede gönderileceğini verir ki bu da bize o bitin uzunluğunu verir(zaman bakımından uzunluğu). Örnek verecek olursam, 19200 bps baud hızı ile veri gönderen bir cihazda bir bitin  uzunluğu 1/19200'den 52 mikro saniyedir. Alıcı cihazımızın da baud hızı 9600 bps olsun. Alıcı cihazın da bir biti okuma süresi 1/9600'den 104 mikro saniyedir. Bu da demek oluyor ki ben 52 mikro saniyede bir veri biti gönderirken karşı taraf 104 mikro saniyede bir bu bitleri okur. Yani ben iki bit gönderiyorum ama alıcı bir bit okuyor.

Bu mantığı bildiğimiz için herhangi bir veri gönderiminde karşı tarafın alacağı veriyi bu yolla çıkarıyoruz. Daha sonra alınan bozuk veriyle, bizim bu yolla bulduğumuz veriyi karşılaştırıyoruz ve eğer aynıysa diyoruz ki bu iki cihaz arasındaki baud hızı parametresi farklıdır. 

Örneğin; seri ekranda bize "Merhaba Lutfen sadece [y] veya [n] karakterlerinden birini giriniz:" sorusu geldiğinde biz de seri ekrana 'y' karakterini girelim. 

'y' karakterinin ASCII karşılığı 121'dir. Bu da binary olarak '01111001' olur. Ben klavyeden 'y' karakterini girdiğimde UART bu veriyi karşı tarafa göndermek için normalde '1' seviyesinde ilerleyen iletim hattına '0' gönderir. Bu haberleşmenin başladığını ve belirtilen haberleşme parametrelerinde veri gönderileceğini gösterir.  Başlangıç bitinden sonra sırasıyla en düşük önemli bitten (LSB)(b0) en yüksek bite (MSB) kadar  gönderilir.  

Verici taraftan veri gönderildikten sonra da normalde '1' olan hattan başlangıç bitini(0) alan alıcı UART haberleşmenin başlayacağını bilir ve kendinde tanımlı olan haberleşme parametrelerine göre bit okur. Aynı şekilde bu bit okuma işleminde ilk okuduğu biti LSB'ye yazar ve sırayla okuduğu bitleri MSB'ye kadar yazar. 

Peki baud hızı farklı olduğunda bu işlem nasıl oluyormuş aşağıdaki tablodan bunu anlamaya çalışalım.


Gördüğünüz gibi 52 µs'de bir veri gönderilmesine karşın 104 µs'de bir veri okununca karşımıza bu şekilde bir durum çıkıyor. Bizim gönderdiğimiz verinin iki biti bir bit gibi okunduğundan dolayı gönderdiğimiz veri bitince alıcı normal hattı(1) da veri olarak okuyup son dört biti '1' olarak okuyor.


Burada aklınıza takılabilecek bir durum; '0-1' geçişleri veya '1-0' geçişleri olduğunda veri nasıl okunuyor?
Bu durumu  iyi anlayabileceğimiz bir örnekle devam edelim. Baud hızı oranları 19200:9600 olan iki cihaz düşünelim. Örneğin 'k' harfinin ASCII karşılığı 107'dir. Binary olarak da '01101011'dir. Seri ekrandan 'k' karakterini gönderdiğimizde neler oluyor bakalım.


Burada da görebileceğiniz gibi '0-1' durumlarında normalde 52 µs'de bir okusa hat hem '0' hem de '1' iken okuyacakken 104 µs' de bir okuduğu için ve bu iki bit uzunluğu da aynı olduğu için (52 µs '0' ve 52 µs '1') alıcı okuma yaptığında hangi bit değeri varsa o değeri okuyor. Yani  '0-1' durumunda alıcı bu sürede alınan bit değerini '1' olarak düşünür. Aynı şekilde '1-0'da da '0' varmış gibi düşünür ve '0' okuyor.

Programı çalıştırıp teyit edersek aynı durumu görürüz.


Eğer ki baud oranı "2:1"den daha farklı bir oran olursa örneğin "3:2" olursa bu sefer de "0-0-1" veya "1-1-0" gibi durumlar ortaya çıkacak. Bu durumda ise hangi bit değerinin uzunluğu fazlaysa , UART o verinin geldiğini düşünür. "0-0-1"de '0' , "1-1-0"da ise '1' biti okumuş olur.



Programı çalıştırıp teyit edersek aynı durumu görürüz.




Baud hızı farklılığında işlerin nasıl yürüdüğünü gördükten sonra programın böyle bir durumda "baud hızı iki cihazda farklılık göstermektedir." gibi bir çıktı vermesi için programı düzenlememiz gerekiyor.

Öncelikle yukarıda da bahsettiğim gibi programın amacı 'y' veya 'n' karakterlerini girdiğimizde bize girdiğimiz karaktere göre bir çıktı vermesi. Fakat program veriyi doğru okuyamadığında  elimizdeki veri farklı olduğu için bizi "else(Genel if döngüsünün else kısmı)" kısmına atar. Burada "belirlenemeyen karakter  alindi" uyarısı verdikten sonra aldığımız veriyi "Hex", "Binary" ve "ASCII" formda görmek için aldığımız veriyi işliyoruz.

Burada "else" döngüsüne girdikten sonra haberleşme parametrelerinde herhangi bir hata yokken girdiğimiz farklı bir karakteri hata olarak değerlendirmemesi için alınan karakterin ASCII karşılığının 128'den büyük olup olmadığına bakıyoruz. Çünkü biliyoruz ki bahsettiğimiz  baud hızı hatalarında alıcı normal hattı(1)  da veri olarak algıladığı için  bizim aldığımız veri çok büyük oluyor. Eğer aldığımız verinin ASCII karşılığını 128'den  büyükse burada bu veriyi işleyebiliriz. Eğer küçükse farklı bir parametre  hatası var mı diye kontrol ederiz.

Veriyi işlemekten kastım verinin "Hex", "Binary" ve "ASCII" karşılığını ekrana yazdırmak.



Bu kısımdan sonra "veri uzunluğu hatası" olup olmadığını  anlamak için veriden 128 çıkarıyoruz ve bu çıkan sonucu ekrana "gelmesi gereken veri" diye yazdırıyoruz. Eğer veri buna eşitse zaten veri uzunluğunun seri:orangepi=7:8 olması durumunda gerçekleşen hatadır ve ekrana bunu yazdırırız.(Bu hata ile ilgili daha detaylı bilgi için UART ile Haberleşme yazısını okuyunuz.) Ama veri "gelmesi gereken veriye" eşit değilse burada bize sorulan soruya seri ekrana 'h' diye cevap veriyoruz. Tabi ki girdiğimiz 'h' karakteri de haberleşme parametreleri bozuk olduğu için farklı bir karakter olarak geleceğinden dolayı 'h'nin bu tarz bir hatada ne diye okunduğuna bakıyoruz. Eğer ki baud hızının 2:1(pc:orangepi) olması durumunda bize sorulan soruya 'h' diye cevap verdiysek bu karakter ASCII kodunda '252' olarak okunuyor. Baud hızının 4:1(pc:orangepi) ve daha büyük oranlarda girilmesinden dolayı bir hatada 'h' girmişsek '255', baud hızı oranı 3:2(pc:orangepi) olduğunda 'h' girmişsek de '232' olarak okunuyor. Bu da demek oluyor ki alınan karakter yukarıda söylediğim değerlere eşit olursa baud hızının farklı olabileceğine dair uyarı mesajı çıktısı yazılacak  ve  programdan çıkılacak.



Kodda görebileceğiniz üzere baud hızının bilgisayarda daha fazla olduğu "2:1", "3:2", "4:1" vb. durumlarda programın hangi döngülere girdiği gözüküyor.







Programı çalıştırdığımız an seri ekranda "Merhaba Lutfen seri ekrana sadece [y] veya [n] karakterlerinden birini giriniz!" yazması gerekirken bozuk karakterler yazdığı için zaten bir hata olduğunun farkında oluyorsunuz fakat ne hatası olduğunu bulmak için bir karakter giriyorsunuz.  'y' karakterini girdiğimizde Orange pi konsol ekranında "Orange pi'ye gelen karakter bilgileri" kısmına bakıyorsunuz ve gelen veriyi inceleyebiliyorsunuz. "Gelmesi gereken karakter bilgilerine" bakıyorsunuz, eğer buradaki karakterse veri uzunluğu hatası var. Eğer değilse 'h' karakterini girdiğinizde size ne tür bir hata olduğunu söylüyor.  Bu hatanın bu aşamada nasıl bulunduğunu ise yukarıda 'h' karakterinin baud hızı hatalarında hangi değerler olarak okunduğunu anlatırken açıkladım.

a)Baud hızının seri bağlantı kurduğumuz cihazda daha fazla olması durumunda 

Eğer ki bilgisayardaki baud hızı Orange pi'de tanımlanan baud hızından düşük olursa bu ne anlama gelir?

Örneğin bilgisayardaki baud hızı 4800 olsun. Bir bitin uzunluğu ise 1/4800'den yaklaşık 208 µs olur. Seri ekrandan bir veri girdiğimizde bu verinin her bitinin uzunluğu 208 µs olurken, Orange pi 104 µs'de bir okuma yapar. Bu durumda seri ekrandan girilen veri Orange pi tarafından sanki birden fazla veri aynı aynı girilmiş gibi anlaşılır.

Örneğin pc:orangepi = 4800 :9600 gibi bir baud hızı tanımlaması yapılmış. Biz bu şekilde iken programı çalıştırıp seri ekrana yazılan "Merhaba Lutfen sadece [y] veya [n] karakterlerinden birini giriniz: " yazısını görünce 'y' karakterini giriyoruz. 'y' karakterinin ASCII karşılığı '121'dir. Binary olarak da '01111001' şeklinde yazılır. Bu veriyi Orange pi'ye 4800 bps ile gönderdiğimizde ne oluyor bakalım.



Yukarıdaki görselde de görüldüğü gibi verinin 4.biti(b3) okunduktan sonra Orange pi 8 bit okuduğu için haberleşmenin bittiğini sanıyor. Sonrasında tekrar '0' bitinin gelmesi ile birlikte  bu biti başlangıç biti gibi düşünüp tekrar veri okumaya başlıyor. Böylece seri ekrandan bir veri girmemize rağmen Orange pi iki veri okuyor.

Yani biz 'y' karakterini girdiğimizde Orange pi '10000110' ve '11111110' gibi iki karakter girişi algılıyor.

Programı çalıştırıp bunu teyit edelim.



Başka bir örnekle karşılaşabileceğimiz durumları göstermek istiyorum.

'g' karakterinin ASCII karşılığı 103'tür. Binary olarak da '01100111' şeklinde yazılır. Bu veriyi Orange pi'ye 4800 bps ile gönderdiğimizde ne oluyor bakalım.




'g' karakterinin iletiminde de aynı şekilde 8 bit okuyor ama sonrasında tekrar '0' biti geliyor. Bu durumda Orange pi bir önceki okuma için 8 bit okumuş fakat bitiş biti okumamış olmasına rağmen gelen '0' biti ile tekrar okumaya geçiyor.  'g' karakterini girdiğimizde yine aynı şekilde Orange pi bunu iki karakter girmişiz gibi okuyor.

Yani biz 'g' karakterini girdiğimizde Orange pi '01111110' ve '00111100' gibi iki karakter girişi algılıyor.

Programı çalıştırıp doğruluğunu teyit edelim.



Bu tarz tüm karakteri böyle analiz ederken 'Space' karakterinin girdiğimde istediğim sonuca ulaşamadım. Yani benim hesapladığım ile Orange pi'nin okuduğu veriler tutmadı. Sonrasında bunun sebebini buldum.

Space karakterinin ASCII karşılığı '32'dir. Binary olarak da '00100000' olarak yazılır. Bu veriyi Orange pi'ye 4800 bps ile gönderdiğimizde ne oluyor bakalım.



Yukarıdaki görsele bakarsanız ilk gelen değerlerin hepsinin '0' olduğunu görürsünüz.  İlk başta bunu normal bir veri gibi düşünüp sonrasında gelen ilk '0' bitiyle birlikte Orange pi tekrar veri almaya devam eder diye düşünmüştüm. Fakat gelen veri '00000000' yani  ASCII karşılığı NULL olunca burada Orange pi hiç bir şey yapmıyor. Bu durumun sonlanması için haberleşme hattındaki veri iletiminin durdurulması lazım. Bunun için bitiş bitini bekliyoruz. Sonrasında gelen '0' biti ile Orange pi tekrar veri okumaya devam ediyor.

Yani biz 'space' karakterini girdiğimizde Orange pi '00000000' ve '11111000' gibi iki karakter girişi algılıyor.

Programı çalıştırıp doğruluğunu teyit edelim.



Bu hata ile ilgili birkaç örnek verdikten sonra programa dönelim. Baud hızı Orange pi'de daha düşük olduğunda gelen verinin 128'den büyük olması şartını bakıyorduk. Fakat burada durum böyle değil. Bunun iki önemli sebebi var.

İlki baud hızı Orange pi'de daha yüksek olduğu için bilgisayardan girilen tek karakter iki karaktermiş gibi algılanıyor. İlk alınan karakter bize sorulan "Merhaba Lutfen sadece [y] veya [n] karakterlerinden birini giriniz: " sorusuna cevap olarak alınıyor fakat ikinci karakter otomatik olarak program işleyişinde önümüze çıkacak ilk soruya cevap olarak atanıyor.

İkinci sebebi  "Merhaba Lutfen sadece [y] veya [n] karakterlerinden birini giriniz: " sorusuna girdiğimiz karakter iki karakter gibi algılanıyordu fakat ilk algılanan karakter bu soruya cevap olarak atanıyor. Yukarıda bahsettiğim 'y' , 'g' ve 'space' karakterine bakarsanız 'g' ve 'space' karakterini girdiğimizde ilk algılan kısım 128'den küçük. 'y' karakterinde ise ilk kısım 128'den büyük.

Şimdi bu karakterleri girdiğimizde program işleyişinde ne oluyor bakalım.

İlk önce 'y' karakterinden başlayalım. Programı başlattığımız an "Merhaba Lutfen sadece [y] veya [n] karakterlerinden birini giriniz: "  soruna karşılık seri ekrana 'y' karakterini giriyoruz.  Haberleşme parametreleri seri:orangepi=4800:9600 olduğu için program bu veriyi düzgün okuyamıyor. İlk okunan karakter "ser.read()" kodu ile birlikte "karakter" değişkenine atanıyor. Yani '10000110'  karakteri "karakter" değişkenine atanıyor.





Ben 'y' karakterini girdiğimde Orange pi iki karakter birden okumasına rağmen "ser.read()" tek karakter okuduğunda dolayı alınan ikinci karakter UART tamponda kalıyor.

Program akışına devam edecek olursa "karakter" değişkenine binary karşılığı '10000110', ASCII karşılığı '134' olan karakter atanıyor. Sonrasında alınan karakter parametre hatasından dolayı ne 'y' ne de 'n' karakteri olmadığı için "else" döngüsüne geçiyor.

Burada "if" ile alınan "karakter" değişkeninin ASCII karşılığının 128'den büyük olup olmadığı değerlendiriliyor. "Karakter" değişkeninin ASCII karşılığı '134' olduğu için bu döngü içine giriyor.  Bu döngüye girdiğinde "karakter" değişkeninin "Binary", "Hex" ve "ASCII" karşılığı yazıldıktan sonra veri uzunluğu hatası olup olmadığının kontrolü için bir de "gelmesi gereken karakter" bilgileri yazdırılıyor.



Eğer sizin girmiş olduğunuz karakter "gelmesi gereken karakter"  değilse "ser.read()" komutu ile sizden bir karakter girmenizi ve bu karakterin 'h' olması isteniyor. Fakat bu sırada tamponda bir veri olduğu için tampondaki bu veri direk "ser.read()" ile tampondan çekilip "karakter2" değişkenine atanıyor.

Orange pi'de baud hızının daha düşük olması durumunda gerçekleşen hatadan dolayı girilen 'h' karakterinin hangi baud hızı hatasında ne olacağını bulup, burada "if" ile şartlandırma yapmıştık fakat bu hata için böyle bir şey yapamıyoruz. Çünkü "karakter2" değişkeni bizim girdiğimiz bir karakter değil. İlk başta girdiğimiz 'y' karakteri iki karakter gibi algılandığından dolayı "karakter2" aslında 'y' karakterinin ikinci kısmı. Bu yüzden "if" ile diğer tüm durumları değerlendirip başka bir seçenek kalmadığında, artık hatanın bu olabileceğinizi söyleyebiliyoruz. Tabi bu kısımda hata olduğunu söylemeden önce hesaplamalarımızın doğru çıktığını görmek için "karakter" ve "karakter2" değişkenlerini de ekrana yazdırıyoruz ki inceleme fırsatımız olsun.





Şimdi gelelim  'g' karakterini girdiğimizde ne oluyor. Programı başlattığımız an "Merhaba Lutfen sadece [y] veya [n] karakterlerinden birini giriniz: "  soruna karşılık seri ekrana 'g' karakterini giriyoruz. Haberleşme parametreleri seri:orangepi=4800:9600 olduğu için program bu veriyi düzgün okuyamıyor. İlk okunan karakter "ser.read()" kodu ile birlikte "karakter" değişkenine atanıyor. Yani '01111110 karakteri "karakter" değişkenine atanıyor.






Ben 'g' karakterini girdiğimde Orange pi iki karakter birden okumasına rağmen "ser.read()" tek karakter okuduğunda dolayı alınan ikinci karakter UART tamponda kalıyor.

Program akışına devam edecek olursa "karakter" değişkenine binary karşılığı '01111110' ASCII karşılığı '126' olan karakter atanıyor. Sonrasında alınan karakter parametre hatasından dolayı ne 'y' ne de 'n' karakteri olmadığı için "else" döngüsüne geçiyor.

Burada "if" ile alınan "karakter" değişkeninin ASCII karşılığının 128'den büyük olup olmadığı değerlendiriliyor. "Karakter" değişkeninin ASCII karşılığı '126' olduğu için bu döngü içine girmiyor. Bu "if" için olan "else" döngüsüne giriyor. Döngü buraya geldiğinde üç durum olabilir. İlki program parametrelerinde bir hata yoktur ve girilen karakter 'y' ve 'n' farklı bir karakterdir. İkinci olasılık şuan üzerinde durduğumuz, baud hızında bir farklılık vardır ve alınan karakterin ilk kısmının ASCII karşılığı 128'den küçüktür. Üçüncüsü ise veri biti uzunluğunun pc:orangepi =8:7 olması durumunda oluşan bir hata vardır.

Burada izleyeceğimiz yol şu şekilde. İlk önce alınan karakteri "girilen karakter" diyerek ekrana yazdırıyoruz. Daha sonra kullanıcıya "Girilen karakter ile yazdiginiz karakter birbirini tutuyorsa seri ekrana 'e' tutmuyor ise 'h' karakterini girin." diye soruyoruz.  Eğer herhangi bir parametre hatası yoksa "girilen karakterle" seri ekrandan girdiğiniz karakter aynı olacağı için bu soruya 'e' diye cevap vermeniz beklenir ve 'e' karakterinin ASCII karşılığı '101'dir. Sonrasında da veri biti uzunluğuyla alakalı bir kontrol yapmamız gerekir. Çünkü veri biti hatası olduğunda inceleyeceğimiz gibi "if" ile bu durumu anlayabiliriz. Fakat baud hızı hatası varsa sorulan soruya alınacak cevap bizim asıl girdiğimiz ve yanlış okunan karakterinin ikinci kısmı olur.  Yani baud hızı hatası varken  "Girilen karakter ile yazdiginiz karakter birbirini tutuyorsa seri ekrana 'e' tutmuyor ise 'h' karakterini girin." sorusu sorulduğunda cevap olarak "karakter3" değişkenine tampondaki değer atılır. Bu değerde belirli bir değer değildir, "karakter3" 'g' karakterinin ikinci kısmıdır.  Bu değer belirli olmadığından bütün olasılıklar değerlendirildiğinde geriye kalan tek olasılığın bu olduğu düşünülür ve girilen veriyi daha iyi incelemek için ekrana "karakter" ve "karakter3" değişkenleri yazdırılır. Daha sonra baud hızı hatası uyarısı verilerek programdan çıkılır.






Burada ekrana baud hızı farklıdır uyarısı yazdırırken farklı bir döngüye girdiğini ifade etmek için uyarız yazısının sonunu "edinaaaa" ile bitirdim.

2)Veri bitinin iki cihazda farklı olması

Veri bitinin iki cihazda farklı olmasını iki başlıkta incelememiz gerekiyordu. Bunlardan ilk "pc:orangepi = 7bit:8bit" durumu. İkincisi ise "pc:orange pi = 8bit:7bit" durumu. İlk durumu daha önceki yazıda anlatmıştım. Fakat ikinci duruma o yazıda değinmemiştim.

Eğer veri uzunluğu kodu yazdığını cihazda(burada Orange pi) "7 bit", seri bağlantı kurduğunuz cihazda "8 bit" olursa ne olur?  Kullandığımız örnek kodun amacı gereği seri ekrandan 'y' karakterini girdiğimizde Orange pi bunu okur ve ekrana "Yes denildi" yazdırır. Aynı seri ekrandan 'n'  karakterini girdiğimizde Orange pi bunu okur ve ekrana "No denildi" yazdırır. Eğer ki bizim seri ekrana yazdığımız karakterler "8 bit" halinde gönderilip Orange pi bunu "7 bit" okursa burada bir kaç durumla karşılaşabiliriz.

İlk durum girdiğimiz karakterini 'y' veya 'n' karakterlerinden biri olma durumu. 'y' karakterinin ASCII karşılığı '121', binary olarak gösterimi ise '01111001' dir. Binary gösteriminde görüyoruz ki 8.biti '0'  Eğer biz ilk 127 karakterden birini girersek bu bit sürekli '0' olur. Bu bit sürekli '0' olursa bizim için önem ifade eden, karakteri tanımlayan bitler ilk 7 bit olur. Orange pi bu 7 biti okuduktan sonra bir başlangıç biti yoksa başka veri okumaz. Fakat 7 bit okuduktan sonra 8.bit sürekli '0 'olduğu için burada tekrar veri gönderildiğini düşünür ve tekrardan veri okumaya başlar.



Şimdi sıra sıra gidelim. 'y' karakteri normalde '1111001' olarak 7 bit halinde gösterilir. Fakat haberleşme genelde 8 bit olduğundan başına '0' biti eklenir ve '01111001' olur.  Bu veriyi Orange pi okurken, haberleşme parametresinde veri "7 bit" olarak tanımlandığı için gelen verinin sadece 7 bitini okur ki bu da '1111001' olur. Bu karakter zaten 'y' karakterine eşittir. Buraya kadar alınan karakter düzgün bir şekilde alınmış gibi gözüküyor. Ama durum böyle değil. Orange pi 7 bit okuduktan sonra gelen '0' biti(gönderilen karakterde 8.bit) tekrardan haberleşme olacağını belirtir. Ve sonrasında okunan veri de herhangi bir veri girişi istenmediğinden tampona atılır. Yani 'y' karakterini girdiğimizde bunu iki karakter gibi okur ama okunan ilk kısım her zaman asıl girmek istediğimiz karaktere eşit olur.

Bu sırada program normal işleyişine devam etmiş ekrana "Yes denildi" yazmış ve döngü başa dönerek tekrardan "Merhaba Lutfen sadece [y] veya [n] karakterlerinden birini giriniz: "sorusunu ekrana yazdırıyor fakat bu sefer sizden bir giriş yapmanızı beklemeden tampondaki veriyi "karakter" değişkenine atıyor.  Tabi bu kısım '1111111(7 bit)' yani '127' olduğundan direk ekrana "girilen karakter" yazdırılıyor. Sonrasında "girilen karakter ile yazdığını karakter birbiri ile tutuyorsa seri ekrana 'e'  tutmuyor ise 'h' karakterini girin" sorusuna 'h' karakterini girdiğimizde bu karakterin değeri "104" olduğunda "if" ile programı yönlendirdiğimiz yerde "veri biti uzunlukları farklıdır" hatası yazdırabiliriz.





'y' karakteri programın girmemizi istediği karakterlerden biriydi. Eğer biz 'y' ve 'n' dışında bir karakter girersek ne oluyor. Buna bakalım.

'g' karakterinin ASCII karşılığı '103', binary gösterimi de '01100111'dir.  Programı başlattığımızda "Merhaba Lutfen sadece [y] veya [n] karakterlerinden birini giriniz: " sorusu ile program bizden bir karakter girmemizi isteyecek. 'g' karakterini girdiğimizde bilgisayardan Orange pi'ye gönderilen ilk 7 bit okunur ve buna göre program ilerlemesine devam eder. Gönderilen verinin 8.biti '0' olduğu için Orange pi bu biti başlangıç biti olarak görür ve bu bitten sonraki 7 biti daha okur ve tampona atar. Bu sırada program işleyişine devam ederken ilk 7 bit 'g' karakterine eşit olduğundan program "belirlenemeyen karakter girişi" uyarısını ekrana yazdırır. Sonrasında girilen karakterin ASCII karşılığının 128'den büyük olup olmadığına bakılır ki bu hatada program bu döngüye girmez. 128'den küçük olduğu için "girilen karakter ile yazdığını karakter birbiri ile tutuyorsa seri ekrana 'e'  tutmuyor ise 'h' karakterini girin" sorusu ekrana gelir ve bizden bir karakter istemesi gerekir aslında. Fakat tamponda tutulan değer bu soruya karşılık alınır. Yani bizden bir karakter girişi olmaksızın program tampondaki değeri bu soruya cevap için alır.



Gördüğünüz gibi alınan ikinci değer(tampondaki değer) '1111111(7bit)'dir. Bu da ASCII olarka 127'ye karşılık gelmektedir. Eğer ki burada gelen değer '127'  olursa programı "if" ile yönlendiğimiz yerde ekrana  "veri boyutu farklıdır" hatasını yazdırabiliriz.



Bu yazı biraz uzun oldu fakat hataların hepsini detaylı bir şekilde incelediğimiz bir yazı oldu. 'https://github.com/koksalkapucuoglu/asenkron_haberlesme/blob/master/haberlesme_parametre_hata_bulma.py'  github deposundan koda ulaşabilirsiniz.

Okuduğunuz için teşekkür ederim. Aklınıza takılan bir soru veya karşılaştığınız bir sorun olduğunda yorumlarda belirtebilirsiniz. Burada eksik olarak anlattığımı düşündüğünüz veya sizlerin gerekli olarak gördüğünüz bilgileri yine yorumlarda yazarsanız, bundan herkesin faydalanmasını sağlamış olursunuz. Herkese iyi çalışmalar.

Öne Çıkan Yayın

ORANGE PI PYTHON UART

ORANGE PI PYTHON UART Python kurulum  yazısında Orange pi'de Python konusuna giriş yapmıştık. Daha sonra  Python Gpio  yazısında gir...