USART Üzerinden Struct Göndermek

Başlatan kimlenbu, 04 Haziran 2014, 17:06:18

kimlenbu

selamlar tekrar,

Konu baya dallanmış budaklanmış :) Yeni başlık açmadan bir şey sorayım hemen.

uint8_t TestVerim[14];

typedef __packed struct MyTestStruct
{
	uint8_t  a; //1Byte
	uint16_t b; //2Byte
	uint32_t c; //4Byte
}MyTestStruct;

MyTestStruct TestStruct[] = {
	{0xAA,0xBBBB,0xCCCCCCCC},
	{0x2A,0x2BBB,0x2CCCCCCC},
};


Gelen verinin işime yarayan kısmını TestVerim dizisine atıyorum, bu diziyi usart üzerinden geri gönderdiğimde içeriğinin doğru olduğunu görüyorum. Aynı şekilde TestStruct'ın içeriğine baktığımda da aşağıdaki şekilde doğru görünüyor.

AA BB BB CC CC CC CC 2A BB 2B CC CC CC 2C


TestVerim dizisinin içeriğini memcpy ile struct'a atmaya çalıştığımda ise structa ekstra bir byte ekleniyor :
memcpy(TestStruct,TestVerim,sizeof(TestVerim));


AA BB BB CC CC CC CC 2A BB 2B CC CC CC 2C 01


0x01 (SOH:Start of Heading) anlamına gelen bir byte ekleniyor. sizeof yerine direkt 14 yazmayı denedim gene olmadı. bu ekstra byte niye ekleniyor ? Nasıl engellerim ?


mufitsozen

sevgili @gerbay arkadas 14 bytelik structure basinca 15 eleman basmis. aslinda sonundaki  01 extra yoksa struct duzgun

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

kimlenbu

kendi
Alıntı yapılan: gerbay - 06 Haziran 2014, 17:42:47
kodlarınızın tümünü görmeden birşey söylenemez, struct a öyle byte falan eklenemez..

kendi kendine düzeldi, ne olduğunu anlamadım bile. tek harf eklemeden doğru çalışmaya başladı.

yldzelektronik

Selamlar.

Simdi usart uzerinden struct olarak paket veri gonderimi olayi cok guzel gozukuyor. Ancak olayi tam olarak kavrayabilms degilim. Bunun tercih sebebi verilerin istifli duzenli gitmesi midir? Baska bir sebebi var midir? Bir de float nasil gonderilecek? Bu konusuldu ama yarim kaldi. Sevgili gerbay bu konuda hakli olarak bize cok kzdi fakat yontem gosterilmedi veya bn kacirdm. Sonucta noktali bir sayi ve usart uzerinden her seyi byte byte gonderebiliyoruz. Ancak ornegin 1.23456789 sayisini baska nasil gonderebiliriz? Struct icinde olur denms olmaz dnms. Nedir isin asli?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Tagli

#34
Aslında struct içinde olup olmamasının bir önemi de yok. Düzenli olsun, efendi gibi gitsin diye öyle yapıyoruz.

Şu da yapılabilirdi:
float gidici = 1.234;
char *baslangic = (char*)(&gidici);
gonderenFonksiyon(baslangic, sizeof(gidici));

Bu en temel hali tabi. Kodun adam gibi gözükmesi için bu işin bir düzeni olmalı. Alıcı taraf ne olup bittiğini bilmeli, yani arada bir protokol olmalı. Ayrıca tabi endian türü uyumlu olmalı.

Not: char'ın 1 byte olduğunu varsaydım. Çoğu platformda bu böyle ama istisnaları var.
Gökçe Tağlıoğlu

berat23

altyazı gürmek gerekiyor galiba. bilmeyen biri gibi bakınca epey karışık gözüküyor.

aslında sorulan struct'ı byte byte yollamak, buna muhtelif cevaplar var.
gerbay 'ın dediği gönerilecek verileri bir struct ile paketleyip yollamak.
mufitsozen'in anlattığı ise paketlerin doğru alınabilmesi için bir metod.

bu sıra ile üst seviyeye doğru gidiyor. bu yönden bakarsanız konu daha anlaşılır olur.

Klein

#36
@berat23
Yok müfit hocamın cevabı Struct'a alternatif ya da onun karşısında bir yöntem değil. Binary alışırken , paket başı sonu vs.. sorunlarına  değişik bir yaklaşım getiren bir algoritma ( en azından kısa bir göz atma sonucunda böyle anladım). Sonuta o algoritmayla kodlanacak ve kodu çözülecek bir veri  dizisi var. Struct kullanmak, veri göndermeyi kolaylaştıran bir yöntem değil. Daha doğrusu haberleşme ile ilgili bir mesele değil. Farklı tipte bir çok veriyi, hiç ekstra kod kullanmadan dizi haline getirip paketlememizi sağlıyor.   

@Tagli
Evet elimizde tek bir veri ya da tek tip veriden oluşan bir dizimiz varken  struct içerisinde olup olmamasının bir önemi yok. Dediğin gibi de göndeririz. Karşıdan da alırız.  Ama veri miktarı artınca ve veri tipleri çeşitlenince , bahsettiğin yöntem efektif olmaktan çıkıyor.  Her çeşit tipten 100 tane değişkenin içeriğini bu şekilde gönderip aldığını bir düşünsene...

@yildizelektronik.

elimizde şöyle basit bir struct olsun.
struct{
int a;  // = 0xA01C
float b; //  =  168.967  farzedelim ki bunun hex karşılığı da  0x3CA00BD2 olsun.
char c; // = 'A'  0x41
char d; // = 'B'  0x42
}

bu yapının hafızadaki görünümü şöyle olacaktır.

adres  0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07
           ------  ------  ------  ------  -------  ------  ------  -------
           0xA0  0x1C  0x3C  0xA0  0x0B  0xD2 0x41  0x42

biz  bu veriyi göndermek iin , 0x00 adresinden başla 0x07 adresine kadar gönder deiğimizde  karşı tarafın tamponunda da aynı veriyi göreceğiz.
Eğer bu adres aynı yipte bir struct başlangı adresi ise,  b değişkenini okuduğumuzda  aynı değeri elde edeceğiz.

@mufitsozen
Hocam! elektronik okumak yerine,  ben bu parite, kur, hisse , borsa gibi şeylerden niye alamıyorum deyip gider ekonomi okursanız, ancak bu kadar programcı olabiliyorsunuz. :) idare edin artık.
Algoritmayı derinlemesine analiz edemedim henüz.  Ama sarsılmaz bildiğiniz bazı şeyleri sarmış olması açısından güzel bir örnek. 

mufitsozen

#37
 
Alıntı yapılan: Klein - 07 Haziran 2014, 19:47:53

@mufitsozen
Hocam! elektronik okumak yerine,  ben bu parite, kur, hisse , borsa gibi şeylerden niye alamıyorum deyip gider ekonomi okursanız, ancak bu kadar programcı olabiliyorsunuz. :) idare edin artık.
Algoritmayı derinlemesine analiz edemedim henüz.  Ama sarsılmaz bildiğiniz bazı şeyleri sarmış olması açısından güzel bir örnek. 


sayin @klein, aramizda kalsin ama 4 ay once async framing nasil olur diye bir arkadasa byte stuffing frame start=7E, escape 2D xor filan falan diye uzun uzun anlatmis hatta birde kucuk fsm yapmistim. Ama durmadan okuyup arastirdigim icin 2 ay once bu COBS denilen algoritmayi buldum sans eseri. Gecen gun bu basligi okuyunca "yasasin dedim, simdi herkese bak ben ne kadar bilgiliyim diye gostermek icin firsat cikti!  :P

@gerbay canavardir ama cok iyi niyetli ve sazan familyasindan turemis canavardir. Oda hemen oltaya geldi "mufit bey sizden ogrenecegimiz cok sey var diye!" (tabii hesabina 100TL hemen o an yatti! :D)

Yani demem o ki, ogrenmek, bilmek ve uygulamak yeterli değil, her gun  yeni birseyler ortaya cikiyor. surekli olarak daha da iyisi olabilirmi diye arastirmak gerekiyor.

Bu arada hem size birazcik teselli olacaksa bende borsada oldukca hatiri sayilir meblaglar kaybettim, su meshur pazarin gorunmez eli ne demek yahu diye rosa luxemburg'un "accumulation of capital"inden john kay"in "culture and prosperity"sine kadar ekonomi okudum bir faydasi olmadi. Yani bendende anca o kadar ekonomist oluyor :) sonucta yasama "isci emeklisi" olarak devam ediyorum. ;)

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

berat23

@Klein

tam anladığınız gibi değil aslında. yaşadım, örnek vereyim. mesela bir sensörden hex data geliyor. adamlar frame sonu bildirmek için cr kullanmış ama bu veri aynı zamanda gelen veride olabiliyor. bu durumda frame sonunu anlamak için 0x0d ararsan hata yaparsın. veriyi struct ile paketleyip yollamak bu tip bir haberleşmenin doğruluğunu garantilemiyor. mufitsozen'in anlattığı algoritmalar veriden bağımsız, unique bir soh ile veri yollamanıza yarıyor, bu sayede paket başı,sonu daha kesin belirlenebiliyor. yani farklı tipte verileri paketlemeye bir çözümü yok(o işi struct ile yapabilirsiniz), paketlerin doğru alınmasına yarıyor. bilmem anlatabildim mi

ilhan_mkp

bu haberleşme konularını öğrenmek için bir süredir okuyorum iki işlemcili bir yapıyı haberleştirmek için nasıl bir protokol kullanmak gerekir bunu öğrenmek için yola çıktım okudukça dallandı budaklandı.
ilk önce modbus ascii gözüme hoş göründü başlangıç  ";" karakteri  ile bitiç "cr\lf" ile yapılması ama "123" göndericem "1""2""3" olarak parçalamak pekte hoşuma gitmedi.

çerçeve olarak neler kullanılabilir bu konuda standart bir yapı varmı modbus protokolleri haricinde yeni nesil neleri araştırmak lazım.
müfit hocam haberleşme konusunda önerebilceğiniz çok kaynak olduğuna eminim.
struct göndermek hoş bir resim bu resmi düzgün bir çerçeveye koymak gerekmezmi ?

Klein

Alıntı yapılan: berat23 - 12 Haziran 2014, 17:20:04
@Klein

tam anladığınız gibi değil aslında. yaşadım, örnek vereyim. mesela bir sensörden hex data geliyor. adamlar frame sonu bildirmek için cr kullanmış ama bu veri aynı zamanda gelen veride olabiliyor. bu durumda frame sonunu anlamak için 0x0d ararsan hata yaparsın. veriyi struct ile paketleyip yollamak bu tip bir haberleşmenin doğruluğunu garantilemiyor. mufitsozen'in anlattığı algoritmalar veriden bağımsız, unique bir soh ile veri yollamanıza yarıyor, bu sayede paket başı,sonu daha kesin belirlenebiliyor. yani farklı tipte verileri paketlemeye bir çözümü yok(o işi struct ile yapabilirsiniz), paketlerin doğru alınmasına yarıyor. bilmem anlatabildim mi
Evet anlatabildin. Ama benim anladığımdan ve yukarıda anlattığımdan farklı olan nedir onu anlamadım?

Alıntı yapılan: Klein - 07 Haziran 2014, 19:47:53
Yok müfit hocamın cevabı Struct'a alternatif ya da onun karşısında bir yöntem değil. Binary alışırken , paket başı sonu vs.. sorunlarına  değişik bir yaklaşım getiren bir algoritma ( en azından kısa bir göz atma sonucunda böyle anladım). Sonuta o algoritmayla kodlanacak ve kodu çözülecek bir veri  dizisi var. Struct kullanmak, veri göndermeyi kolaylaştıran bir yöntem değil. Daha doğrusu haberleşme ile ilgili bir mesele değil. Farklı tipte bir çok veriyi, hiç ekstra kod kullanmadan dizi haline getirip paketlememizi sağlıyor.