Veri Formatı Oluşturma

Bowman

Üye
Katılım
7 Ekim 2022
Mesajlar
98
Atıyorum elimde iki tane mikroişlemci olsun. Bir tanesi master olan, slave olarak davranacak mikroişlemciye UART-RS232 üzerinden 100 mili saniyede bir veri atsın. Veri formatı da sallıyorum 20 byte olsun. Bunun içinde spesific header, data length, command type gibi bilgiler de bulunsun. Aynı zamanda bu veri formatı içerisinde sensörlerden alınacak verileri de barındıracak. Örnek olarak şöyle bir şey yazayım.

Header ABC olsun. Data length 20(byte), command type da 0xA0. Veri formatım şöyle bir şey olacak "ABC20A0(sensör verileri)checksum". 100 mili saniyede bir veri atma işini timer ile yapabilirim diye düşünüyorum. 100 mili saniyede bir kesme oluşturacak bir timer konfigüre edip kesmede uart ile verileri gönderebilirim diye düşündüm. Fakat o veri formatını nasıl oluşturabilirim konusu kafamda canlandıramadım. Sensör verisi hariç gerisi sabit olacak o veri formatında sensör verisi değişecek sadece.

Nasıl yapılabilir bu?
 
Protokol işin kolay tarafı. Asıl güvenilir, sağlam ve hatalar karşısında çalışmayı sürdürecek kodu yazmak zor olur.

Protokol tarafında <length1><data1><length2><data2> ... yapısı güzel. Ama data içerisinde ilk byte "version" olsun. Böylece ürünler geliştikçe daha gelişkin bir paket yapısı olursa, hem eski hem yeni paket versiyonlarını destekleyebilirsin.
 
Protokol işin kolay tarafı. Asıl güvenilir, sağlam ve hatalar karşısında çalışmayı sürdürecek kodu yazmak zor olur.

Protokol tarafında <length1><data1><length2><data2> ... yapısı güzel. Ama data içerisinde ilk byte "version" olsun. Böylece ürünler geliştikçe daha gelişkin bir paket yapısı olursa, hem eski hem yeni paket versiyonlarını destekleyebilirsin.
Ben protokolü yazılıma nasıl dökerim kısmında takıldım. İnternette de arıyorum fakat çok yararlı bir kaynak bulamadım. Bildiğiniz güzel bir kaynak varsa çok sevinirim.

Ben şöyle düşündüm.

C:
typedef struct{
    char* header;
    uint8_t data_length;
    uint8_t command_type;
    uint8_t sensor_data[16]
}data_frame;

Burada bir frame_init() fonksiyonu ile başlangıç değerlerini atayabilirim diye düşündüm. Sensör verilerini de bir şekilde ADC'den okudukça yazarım diye düşündüm. Protokolü oluşturmak için güzel bir kaynak kod bulamadım internette. Benim aklımdaki şey elimdeki farklı sayıları birleştirip UART üzerinden göndermek. Belki daha mantıklı bir yol da vardır.
 
Mesele protokolü oluşturmak değil. Oluşturmuşsun zaten. UART'a yazmak konusunda da bir sıkıntı yok. İlgili kütüphane fonksiyonunu kullanarak veya doğrudan hardware register'lerine erişerek yazarsın.

Asıl mesele verinin her şart altında karşı tarafa ulaştığını temin etmek, iki tarafın da senkron olmasını sağlamak. Şöyle bir örnek vereyim:

Normal çalışma şartlarında alıcı her zaman header byte'ını bekliyor olacak. Header gelince geri kalan byte'lar da gelecek, paket tamamlanacak, işlenecek ve alıcı tekrar header beklemeye başlayacak. Ama diyelim bir sorun çıktı ve alıcı header'i kaçırdı, ilk okuduğu byte data_length oldu. Hata vermeye devam edecek, ta ki bir header okuyana kadar. Ama orada da şu tehlike var: data length byte, header byte'a eşit olabilir. O zaman da alıcı yeni bir paket başladığını zanneder ve tekrar hatalı paket okur. Kötü senaryoda bu senkronizasyon kaybı çok uzun sürebilir ve gönderici ile alıcı arasında uzun süre paket transferi yapılamaz. Hatta en olumsuz durumda alıcı ve verici hiçbir zaman senkronizasyonu yakalayamayabilir. İşte böyle bir senaryonun olmamasını temin etmen lazım. Alıcı ve verici senkronizasyonu kaybederlerse, bu durum hem çok kısa zamanda algılanabilmeli, hem de tekrar senkronizasyona ulaşacak bir prosedür izleyebilmeli.

Bunların üzerinde kafa yorman lazım. Bunlar çok ayrıntılı konular, hazır kaynak bulmak kolay değil.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,847
Mesajlar
99,719
Üyeler
2,481
Son üye
rfdog12

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top