RS232 ile float32 tipinde değişken nasıl gönderilir?

Başlatan musti463, 08 Kasım 2013, 00:44:31

musti463

Merhaba CCS C'de RS232 kullanılarak float32 tipinde değişken nasıl gönderilir ve karşı taraftan nasıl alınır?
Mustafa Emir SADE

musti463

Bu konu altında birşey daha sorayım

463 sayısını gönderen ve alan rs232 komutlarını yazarmısınız kafayı yiyecem hep tek hane gösterip duruyor.
Mustafa Emir SADE

yldzelektronik

Önce floatı söyleyelim.Float noktalı sayı olduğundan gönderme fonksiyonuna da bu formatta girmen gerek.Printf gayet kullanışlı.Onu kullanalım.
printf(Float sayi: %f\r\n",flt);


Şimdi floatta olduğu gibi 463 sayısını da düşünelim.

463 255den büyük.Demek ki bu en az iki byte bir sayı.Demek ki long. O zaman printf e de bunu bildirmemiz gerekli.

printf("En az iki byte sayi: %lu\r\n",Long_Sayi);


Burada önemli bir şey var.Orada u değilde d de olabilirdi. u unsigned d signed demek.

Sormadan evvel kullandığın derleyicinin help ini kullan.!

F12 ye bas. Hemen sorununu düzgünce yaz sana hemen yardım edecek.Mesela böyle durumlarda ben hemen printf yazıyorum ve bana hangi formatlarda nasıl veri gönderebileceğimi söylüyor.

Selametle..
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

respected

floating point diye bir yöntem var onunla yapabilirsin. 

musti463

Alıntı yapılan: yldzelektronik - 08 Kasım 2013, 09:22:00
Önce floatı söyleyelim.Float noktalı sayı olduğundan gönderme fonksiyonuna da bu formatta girmen gerek.Printf gayet kullanışlı.Onu kullanalım.
printf(Float sayi: %f\r\n",flt);


Şimdi floatta olduğu gibi 463 sayısını da düşünelim.

463 255den büyük.Demek ki bu en az iki byte bir sayı.Demek ki long. O zaman printf e de bunu bildirmemiz gerekli.

printf("En az iki byte sayi: %lu\r\n",Long_Sayi);


Burada önemli bir şey var.Orada u değilde d de olabilirdi. u unsigned d signed demek.

Sormadan evvel kullandığın derleyicinin help ini kullan.!

F12 ye bas. Hemen sorununu düzgünce yaz sana hemen yardım edecek.Mesela böyle durumlarda ben hemen printf yazıyorum ve bana hangi formatlarda nasıl veri gönderebileceğimi söylüyor.

Selametle..

Hocam rs485 de bilgiler 1 bayt 1 bayt gidiyor diye biliyorum.Biz float tipinde olan 8 baytlık veriyi parçalara bölerek sırayla göndermemiz gerekmez mi?
Mustafa Emir SADE

berat23

göndereceğin sayının adresini char* tipine cast et, sonra bu adresteki veriyi 1er arttırarak yolla.

musti463

Alıntı yapılan: berat23 - 08 Kasım 2013, 13:15:31
göndereceğin sayının adresini char* tipine cast et, sonra bu adresteki veriyi 1er arttırarak yolla.

örnek kod paylaşabilirmisiniz?
Mustafa Emir SADE

Tagli

Şöyle olsa gerek:
float gidici[5]; //5 tane float olsun
char *ptr = (char*)gidici; //gidici dizi değil tek olsaydı sağ taraf (char*)(&gidici); olurdu
for (int i = 0; i < 5 * sizeof(float); ++i){
    seriGonder(*ptr);
    ++ptr;
}
Gökçe Tağlıoğlu

yldzelektronik

Alıntı yapılan: musti463 - 08 Kasım 2013, 12:57:46
Hocam rs485 de bilgiler 1 bayt 1 bayt gidiyor diye biliyorum.Biz float tipinde olan 8 baytlık veriyi parçalara bölerek sırayla göndermemiz gerekmez mi?

485,232 fark etmez bir byte 1byte gidiyor evet.Ona bakarsak 1 bit 1 bit gider.Seri iletişim sen işin o tarafına karışmıyorsun ki?Gönderdiğin veriyi ascii karakter olarak göndereceksin.Sen 4,63 sayısını göndermek istiyorsun varsayalım.

Önce '4' sonra '.' sonra '6' sonra '3' verisi gidecek.Veriyi alan tarafta aldığın bu veriler birer sayı değil.Karakter. Bunları yine ccsnin liblerinde bulunan bir fonksiyon ile floata çevirebilirsin.

atof();

Bu fonksiyona girdiğin parametre bir dizi olacak.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

z

Float sayı kac byte ise o kadar datayı karşıya yollayın. Eğer float sayısı printf vs ile decore ederseniz işi uzatırsınız. Float sayınız 4 byte mı? 4 byte yollayın karşıya. Değişkenin bytelerını tek tek okuyup gönderdiğiniz sırada karşı taraf paketleyip bir değişkenin içine yazarsa float sayı değişken içinde belirmiş olacaktır.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

z'nin de dediği gibi, diğer tarafta da tam tersi işlem yapılacak. char türünden bir tampon bellek dizisinin pointer'ı, float pointer'ına cast edilerek okunacak.
Gökçe Tağlıoğlu

musti463

Yanıtlar için çok teşekkürler dediklerinizi uygulamaya çalışacağım. CCS C nin RS485 kütüphanesini inceledim ve şöyle bir program yazdım fakat aşağıda kalın yazılmış yerlere tam olarak ne yazacağız anlamadım.Yinede birşeyler denedim ISIS de kodları aşağıda paylaşıyorum

/// int1 rs485_get_message(int* data_ptr, int wait)                 ////
////     * Get a message from the RS485 bus                          ////
////     * Address can be 1 - 33.                                    ////
////     * A 1 will be returned if a parity check error occurred.    ////
////                                                                 ////
//// int1 rs485_send_message(int to, int len, int* data)             ////
////     * Send a message over the RS485 bus                         ////
////     * Inputs:                                                   ////
////          to    - Destination address                            ////
////          len   - Message length                                 ////
////          *data - Pointer to message                             ////
////     * Returns TRUE if successful, FALSE if failed   

VERİCİ:

#INCLUDE <16F877A.H>
#USE DELAY (CLOCK=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stop=1,parity=n)
#include <input.c> 
#include <rs485.c>
#define use_portb_lcd true
#INCLUDE <LCD420.c>
#define re pin_d0
#define de pin_d1
int8 data=1;
//
void main()
{
rs485_init();

output_high(re);
output_high(de);
delay_ms(50);

rs485_send_message(1,128,&data);

}



ALICI:

#INCLUDE <16F877A.H>
#USE DELAY (CLOCK=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stop=1,parity=n)
#include <input.c> 

#define use_portb_lcd true
#INCLUDE <LCD420.c>
#INCLUDE <rs485.c>

#INCLUDE <stdlib.h>
#define re pin_d0
#define de pin_d1

#define RS485_ID 1
int veri=5;
//
void main()
{

lcd_init();
output_low(re);
output_low(de);
//
while (1)
{
rs485_get_message(veri,0);
printf(lcd_putc,"\fgelen=%u",veri);
delay_ms(500);

}}



Bu kodları çalıştırdığımda grafik ekranda 5 bilgisi görünüyor.Eğer hattan bilgiyi alabilmiş olsaydı 1 bilgisi görünmesi gerekirdi.Demekki ya gönderemiyorum ya alamıyorum.Adresleme işini mi yanlış yapıyorum acaba?
Mustafa Emir SADE

yldzelektronik

#12
int1 rs485_get_message(int* data_ptr, int wait)


İle hattan veri alıyorsun. İlk parametre gelen veriyi kaydetmek istediğin değişkenin adresi.İkinci parametre bu veriyi ne kadar beklemek istiyorsun?

int1 rs485_send_message(int to, int len, int* data) 


Bu da hatta veri gönderen fonksiyonun.İlk parametre kime gidecek?Adres.İkinci parametre gidecek verinin uzunluğu.Üçüncü parametre gidecek verinin bellekte nerde olduğunu gösteriyor.

Alıntı Yap// Purpose:    Get a message from the RS485 bus and store it in a buffer
// Inputs:     1) A pointer to a buffer to store a message
//             2) TRUE  - wait for a message
//                FALSE - only check if a message is available
// Outputs:    TRUE if a message was received
//             FALSE if wait is FALSE and no message is available
// Note:       Data will be filled in at the pointer as follows:
//             FROM_ID  DATALENGTH  DATA...
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

musti463

Alıntı yapılan: yldzelektronik - 08 Kasım 2013, 15:28:12
int1 rs485_get_message(int* data_ptr, int wait)


İle hattan veri alıyorsun. İlk parametre gelen veriyi kaydetmek istediğin değişkenin adresi.İkinci parametre bu veriyi ne kadar beklemek istiyorsun?

int1 rs485_send_message(int to, int len, int* data) 


Bu da hatta veri gönderen fonksiyonun.İlk parametre kime gidecek?Adres.İkinci parametre gidecek verinin uzunluğu.Üçüncü parametre gidecek verinin bellekte nerde olduğunu gösteriyor.

mesela hocam float yuk_bilgisi=12.8 bilgisini gönderirken rs485_send_message(0x01,1,*yuk_bilgisi) mi dememiz gerekiyor.Birde gönderici ve alıcı adresleri nasıl veriliyor? ve "int len" kısmına veri 8 bayt ise 8 olarak mı yazıyoruz?

Mustafa Emir SADE

musti463

Mustafa Emir SADE