Yüksek boyutlu verileri Paket paket gönderme nasıl yapılır?

Başlatan Mucit23, 16 Ağustos 2017, 10:56:53

Mucit23

Selamlar

Bir konuda algoritma önerisine ihtiyacım var. 1K veya 2K boyutlu bir veri olsun. Bu karakter dizisi olabileceği gibi sayısal veride olabilir. Bu verileri c# da USB ile göndermeye çalışıyorum.  USB Custom HID sınıfı tek seferde 64 byte gönderdiğini biliyorum. Bu durumda bu verileri paket paket göndermem gerekiyor. Aynı şekilde alıcı taraftada uygun bir şekilde alıp tekrar aynı formata çevirmeye çalışıyorum. Bu işi nasıl yapmalıyım bu konuda önerinize ihtiyacım var.

Verinin boyutu belli değil?
Kaç paket gideceği belli değil ve ben tek seferde en fazla 64 byte gönderebiliyorum.

Bu iş için nasıl bir yöntem izlenebilir?Ben düz mantık bir şeyler yapmaya çalıştım ama pek aklıma yatmadı. 

foseydon

Elinizdeki veriyi 64 byte büyüklüğünde paketlere ayırıp, her paketin içerisinde o paketin daha büyük bir paketin parçası olsugunu bildirin.2 byte bir alan yeterli olacaktır. Misal 0 tek paket anlamına gelsin. 1 daha büyük paketin ilk parçası anlamına gelsin. Alıcı 1 gördüğü zaman, işlemeye başlasın ta ki tekrar 0 görene kadar. Tekrar sıfır görünce, son paketin numarası ile toplam paket sayısını karşılaştırıp kayıp var mı kontrol edersiniz. Gelen paket numaralarını bir yerde tutarsanız, kayıp olduğu durumda vericiden bu paketi tekrar isteyebilirsiniz.

fahri-

Her göndereceğiniz datadan önce o datayla ilgili bilgileri içeren bir header data gönderin. Alıcı header datayı aldığında arkadan gelecek base datanın tüm özelliklerini bilecek ve ona göre davranacak.
mpeg2 transport stream yapılarını incelerseniz size daha güzel fikirler verebilir.

kantirici

Veri iletişimindeki crc v.s gibi durumları alt katman hallettiği için çokta derine inmeye gerek yok. Basılan her datanın karşıya ulaştığı varsayılabilir.


1 byte header iş görecektir. Paketin numarası ve paketin başlangıç bitiş ve ara paketler olduğuna dair bir bilgi iş görecektir.
typedef struct
{
  uint8_t packge_info :2;
  uint8_t package_no :6;
}header_t


typefe struct
{
  header_t header;
  uint8_t   buff[63];
}buffer_t



packge_info  için;

00 : Yeni frame
01 : Ara paketler
11 : Frame sonu

package_no yada kaçıncı paket olduğu bilgisini koyarsınız ve paketlerin numarasını sıraya uygun mu diye kontrol edersin. Alım içinde bir state machine iyi olur.