Paket Algoritması
Özellikle MCU haberleşmelerinde kullanılan bir takım haberleşme protokollerinde sabit bir veri bloğunun gönderilmesi ve gönderilmekten ziyade bu verilerin kontrol edilmesi bir hayli zor.
Bunun için çeşitli algoritmalar olmakla birlikte en çok kullanılan yöntemlerden biri paket yöntemidir.Paket yöntemi haberleşen 2 tarafında bildiği bir yapıdan oluşmaktadır.Bu pakette çeşitli başlangıç, bitiş ve kontrol bytelar’ı bulunur.Benim kullandığım paket yapısı şöyledir.
[PACKET] = [X][Y][DATA][Z]
Burada X,Y ve Z sabit birer BYTE’dır. DATA ise bizim karşı tarafa yollayacağımız veridir.
Karşı tarafa göndermek istediğimiz 8 byte’lık bir verimiz olsun önce bir X BYTE’ı yani ilk başlangıç BYTE’ı 2. olarak bir Y BYTE’ı ardından uzunluğu belirli olan verileri yani DATA dizisini ve son olarak Z yani bir “CheckSum” BYTE’ı yollanır.11 BYTE’lık bir Paketimiz olur.Bu paket yollandıktan sonra karşı tarafta gelen veri X ise yeni gelene bakarız.Yeni gelen veri Y ise belirlediğimiz veri uzunluğunda okuma yaparız bu bizim orijinal verimizdir ve bunu bir diziye kaydederiz.Son olarak Z geldi ise bizim verimiz doğru olarak gönderilmiş demektir.Bu yapıyı C++ ile bir örnek olarak hazırladım.Burada siz Transmitter yani verileri yollayan tarafsınız.Her karakteri girdikçe durumu gözleyebilir ve veriyi okuyabilirsiniz.Ben X’i ‘&’ karakteri, Y’yi ‘#’ karakteri ve Z’yi ‘+’ karakteri olarak belirledim.
main.cpp
#include <iostream> #define PACKET_LENGHT (10) using namespace std; unsigned int state = 0; unsigned int dataOk = 0; unsigned int byteCounter = 0; unsigned char receivedData = 0; unsigned char receivedPacket[10]; int main() { for(;;) { if(dataOk == 1) { dataOk = 0; cout<<“Packet OK !\n”; cout<<“Packet = “; for(int i = 0; i < PACKET_LENGHT; i++) cout<<receivedPacket[i]; cout<<“\n\n”; } cout<<“Data = “; cin>>receivedData; cout<<“\n”; switch(state) { case 0: if (receivedData == '&') { byteCounter = 0; state = 1; } break; case 1: if (receivedData == '#') state = 2; break; case 2: receivedPacket[byteCounter] = receivedData; ++byteCounter; if (byteCounter == PACKET_LENGHT) state = 3; break; case 3: if (receivedData == '+') { dataOk = 1; state = 0; } else { // Packet Error Handler } break; } cout<<“State = “<<state<<“\n”; cout<<“Counter = “<<byteCounter<<“\n\n”; } return 0; }
Son yorumlar