GİRİŞ
Bir bilgisayardan gönderilen her mesajın içeriğinde bozulma olmadığının, mesajı alan bilgisayar tarafından anlaşılabilmesi için gönderen taraf, bir yöntem ile mesajın sonuna "doğruluk" kodu ekler. Alan taraf aynı yöntemle "doğruluk" kodunu hesaplar ve gelen bilgi ile karşılaştırır. "Doğruluk" kodu eşit bulunmuş ise mesajın içeriği doğru algılanmıştır. Aksi halde mesaj, hatalı alınmış veya iletişim şebekesinde bozulmuştur, yinelenmesi gereklidir.
Burada iki değişik yöntemle hesaplanan "doğruluk" kodunun gelen algoritması ve C dili ile yazılmış örnek programları anlatılmıştır.
LRC KODLAMA YÖNTEMİ
LRC kodlamada mesajın başlangıç noktasından mesajın sonuna kadar her byte bir önceki ile "EXOR" yapılır. Bu işlemde ilk byte ya STH (0x01) veya STX (0x02) olduğundan LRC kodlama alınmaz, çünkü bu değerlerle başlamayan mesajlar zaten alan program tarafından dikkate alınmaz. Hesaplama sonunda elde edilen byte mesajın sonunda gönderilir. Genel mesaj yapısı
[STX][data bytes][ETX][LRC]biçimindedir.
lrc(char *data, int len)
{
lrcval = data[1];
for(i=2;i<len;i++)
lrcval = lrcval ^ data[i];
return(lrcval);
}
CRC KODLAMA YÖNTEMİ
Burada kullanılan yöntemde doğruluk bilgisi 2 byte olduğundan LRC yöntemine göre daha doğru çalışır. LRC yönteminde bazı bilgiler bozulmuş olsa bile doğru LRC hesaplama olasalığı vardır. Bu olasalık CRC yönteminde biraz daha azaltılmıştır. Ancak kullanılan polinom veya tabloya göre değişik yöntemlerle CRC hesaplanabilir. Aşağıdaki örnek program bir yönteme göre nasıl CRC hesaplanacağını gösterir. Bir bilgide kullanılan CRC doğruluk kodu, aynı algoritma ile yeniden elde edilebilir. Algoritmanın değişmesi durumunda aynı CRC kodunu üretmek söz konusu olmaz.
Gelen bilgideki ilk byte CRC hesaplamasına alınmaz. Diğer bilgilerden hangisinin hesaplamaya alındığı karşı taraftaki programdan öğrenilmelidir. Mesajın genel yapısı :
[STX][data bytes][ETX][CRC-16]
biçimindedir.
short calc_crc(char far *p, int n)
{
int i,k,x;
char x1[2];
/* CRC 16 hesaplama modulu */
x = 0;
for (i = 0; i < n; i++) {
x = x ^ (p[i] << 8);
for (k = 0; k < 8; k++)
if(x & 0x8000)
x = (x << 1) ^ 0x8005;
else
x = (x << 1);
}
*(short *)x2 = x;
/*
hesaplanan CRC bilgisinin varsa LH ozelligini
HL durumuna cevirilmelidir
*/
x1[0] = (x >> 8) & 0xff;
x1[1] = x & 0xff;
return(*(short *)x1);
}
Ana Sayfaya Teknik Bilgiler Sayfasina

