UART'dan float tipinde veriyi nasıl göndeririz?

Başlatan musti463, 16 Ağustos 2014, 16:02:20

musti463

Merhaba, iki PIC arası RS485 haberleşiyorum. Int türünde bilgi gönderebiliyorum fakat Float türündeki veriyi nasıl gönderebileceğimi bilmiyorum yardımcı olabilirmisiniz? (Gönderilecek veri örn: 24.83)
Mustafa Emir SADE

kimlenbu

aşağıdaki makroyu projene ekle

//degisken = 0x1234 olsun BYTE(degisken,0) yazinca 4 döndürüyor. BYTE(Degisken,0)= 9 yazınca degisken 0x1239 oluyor.
#define BYTE(var,index) *(((unsigned char*)&var)+index)


float 4byte olduğu için gelen veriyi byte byte değişkenine at.

musti463

byte byte nasıl atıcaz hocam onunda kodunu paylaşabilirmisiniz
Mustafa Emir SADE

kimlenbu

göndermek için

usart_gonderme_fonksiyonu(BYTE(degisken,0));
usart_gonderme_fonksiyonu(BYTE(degisken,1));
usart_gonderme_fonksiyonu(BYTE(degisken,2));
usart_gonderme_fonksiyonu(BYTE(degisken,3));

bu şekilde veya döngü içinde float değişkeninin 4 byte'ını yollarsın

alıcı tarafta da bunları

BYTE(degisken,0)=gelenveri;

şeklinde tekrar float değişkenine byte byte yazabilirsin.

byte senkronu için bir mekanizma kurman lazım, atıyorum "veri geliyor" stringi yollarsın, bundan sonraki 4byte ta da veriyi yollarsın.


musti463

RS485 ile 25.67 bilgisini, önce virgülden öncesi  25 ve sonra virgülden sonrası 67 nasıl gönderilir ve alıcıda nasıl birleştirilir ?
Mustafa Emir SADE

quarko

Göndermeden önce virgüllü sayıyı 100 ile çarpıp virgülden kurtar. Karşıya integer olarak gönder. Alıcı tarafta integer sayıyı aldıktan sonra 100 e bölüp float değişkene alırsın, böylelikle sıkıntısız olarak verini göndermiş olursun.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

musti463

Mantık güzel fakat ccs c ile nasıl göndereceğiz. Gönderme ve alma komutları neler?
Mustafa Emir SADE

ali.bayuk

en temel yöntemle şöyle yapılır.
float 32bit olduğundan 4 bayt olarak böleriz.
bayt1 = float_sayi & 0x000f;
bayt2 = (float_sayi & 0x00f0)>>8;
bayt3 = (float_sayi & 0x0f00)>>16;
bayt4 = (float_sayi & 0xf000)>>24;
bu 4 baytı gönderebilirsin.

aldığında da söyle yapacaksın;
float_sayi = bayt1 | (bayt2<<8 ) | (bayt3<<16) | (bayt4<<24);

dediğim gibi en temel şekilde böyle çözersin.
kolay gelsin.

quarko

Alıntı yapılan: musti463 - 16 Ağustos 2014, 16:02:20
Merhaba, iki PIC arası RS485 haberleşiyorum. Int türünde bilgi gönderebiliyorum fakat Float türündeki veriyi nasıl gönderebileceğimi bilmiyorum yardımcı olabilirmisiniz? (Gönderilecek veri örn: 24.83)

Alıntı yapılan: musti463 - 17 Ağustos 2014, 13:58:06
Mantık güzel fakat ccs c ile nasıl göndereceğiz. Gönderme ve alma komutları neler?

Konuyu açarken yazdığınız mesajı okuyan birisi RS485 üzerinden bağlantıyı gerçekleştirdiğinizi ve integer olarak veri gönderebildiğinizi gayet kolay olarak anlayabilir. Fakat ikinci mesajı okuyunca nasıl göndereceğiz, gönderme ve alma komutları neler diye soruyorsunuz... Peki size sormazlar mı, "bu ne perhiz bu ne lahana turşusu" diye...

"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

saucompeng

#9
usngined char data[4];
float sayi=23.6784;

char * tmp;

tmp=&sayi;

data[0]=*tmp;
tmp++;
data[1]=*tmp;
tmp++;
data[2]=*tmp;
tmp++;
data[3]=*tmp;


putc(data[0]);
putc(data[1]);
putc(data[2]);
putc(data[3]);


c#'ta alacaksan eğer , 4 byte lık bi dizi olduğunu düşünürsek. Bu dahada fazla olabilir.

byte[] gelen=new byte[4];

float sayi=Bitconvert.ToSingle(gelen,0); //Burdaki 0 float sayının ilk byte ' ının bulunduğu indextir.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...