Projelerimde sıklıkla mikro denetleyici ile PC arasında UART iletişimi kurmam gerekiyor. Bu iletişimin güvenli olması için CHECK SUM kontroluna başvuruyorum.
Checksum uygulaması için çeşitli standartlar var. Ben 8 bit Mod256 olarak adlandırılan yöntemi kullanıyorum.
Bu yayında PC den mikro denetleyiciye bir Python programı ile gönderdiğim text satırları için uyguladığım checksum yöntemini anlatacağım.
PYTHON İLE CHECK SUM HESABI
Bu açıklamayı terminal uygulaması üzerinden yapmak istiyorum. Bunun için bilgisayarınızda Python yüklü olmalı. Ben bu yayını yaparken en güncel Python sürümü V3.9 idi.
Terminali açarak ‘python3’ yorumlayıcısını çalıştıralım.
‘>>>’ şeklindeki Python promptu çıkınca devam edelim. Örnek olarak kullanacağımız text satırı “00300005000\n”. Bunun 8 Bit MOD256 yöntemi ile hesaplanan checksum değeri 0xDE.
Örnek satırımızı text değişkenin yerleştirerek yaptığımız atamanın sonucunu kontrol edelim.
>>> text = “00300005000\n”
>>> text
‘00300005000\n’
Şimdi checksum hesaplama işlemine başlayabiliriz. Önce satırdaki tüm karakterlerin toplamını buluyoruz:
>>> toplam = 0
>>> for c in text:
… toplam +=ord(c)
…
>>> toplam
546
Sonuç 546 oldu. Bunun 0xFF e bölümünden sonra kalanı bulalım. Sonucun, işaretini ters çevireceğiz:
>>> checksum = toplam%256
>>> checksum
34
>>> checksum = -checksum
>>> checksum
-34
Bu sonucun en küçük 8 biti ulaşmak istediğimiz checksum değerini veriyor. Elde ettiğimiz sonucu UART üzerinden gönderebilmek için ASCII karakterlerden oluşan bir stringe çevirmemiz gerekiyor. Bu amaçla Python un formatlama aracından yararlanacağız.
(Bu formatlama işlemi için daha ayrıntılı bilgi için burayı tıklayabilirsiniz.)
>>> hexsum = ‘%2X’ % (checksum & 0xFF)
>>> hexsum
‘DE’
Böylece örnek satırımızın 0xDE olan checksum byte’ını bulmuş olduk. Bunu UART üzerinden satırımızın sonuna ekleyerek gönderiyoruz:
>>> text1 = text+hexsum
>>> text1
‘00300005000\nDE’
ALIŞ TARAFINDA CHECKSUM KONTROLU
Alış tarafındaki mikro denetleyici UART üzerinden gelen satırın ‘\n’ sonlandırma karakteri de dahil olmak üzere satırdaki tüm karakterlerin toplamını bulur. Bulduğu toplamı ‘\n’i takibeden iki karakterle gelen chceksum değeri ile toplayıp sonucun en küçük 8 bitini alır. Bu işlemin sonucunun 0x00 olduğu görülürse veri alışverişinin başarılı olduğu anlaşılmış olur. Aksi halde aynı satırın tekrar gönderilmesi istenir:
>>> result = toplam + checksum
>>> result
512
>>> result = (toplam + checksum) & 0xFF
>>> result
0
>>>
Gördüğümüz gibi, checksum kontrolunda sonuç ‘0’ çıktı,.Veri aktarımı başarılı olmuş.