Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Double to string

Başlatan baran123, 19 Haziran 2015, 18:30:21

baran123

Double bir değeri string çevirip USART  dan göndermek istiyorum.Bu çevirme işlemini nasıl yapabilirim ?

Tagli

Bu tür dönüşüm işleri için genelde sprintf fonksiyonu kullanılır.

char gidici[20];
sprintf(gidici, "%f", degisken);
yolla(gidici, strlen(gidici);


Belki printf veya fprintf'i doğrudan seri porta yönlendirmenin bir yolu vardır. ARM'ı bilmiyorum ama mesela PIC için XC derleyicilerinde buna benzer bir çözüm vardı. Yine de daha genel bir çözüm olması sebebiyle bence sprintf daha iyi.
Gökçe Tağlıoğlu

baran123

#2
Hocam şu şekilde bir deneme yaptım.

static char MyText[30];
static double COppm = 32.56;

//main
DoubleToString(COppm);

//func
static void DoubleToString(double d)
{
    sprintf(MyText, "%f", d);

    int i;

    for(i = 0; i < 30; i++)
    {
        USART_SendData(USART2, MyText[i]);
    }
}

Fakat PC den baktığımda hiç bir şey gelmiyor.
---
Tamamdır çözüldü.(Float iel yapıldı.Double içinde deniyeceğim.)Muhittin ağabey sağ olsun. :)
"projede builtoption-compiler setting-other option a -u _printf_float ı ekle."

ve şu şekilde kullandım

static char MyText[30];
static float COppm = 32.56;

static void USART_SendString(USART_TypeDef* USARTx, volatile char* MyString)
{
	while(*MyString)
    {
        while(!(USART2->SR & USART_FLAG_TC));
		USART_SendData(USARTx, *MyString);
		MyString++;
	}
}

static void FloatToString(float f)
{
    sprintf(MyText, "%2.2f", f);
}

kantirici

#3
stringe çevirmeden union ile yapılabilir.

union u
{
    double f;
    char s[sizeof double ];
};

union u foo;
foo.f = 2.45;

send(foo.s[0]);
.
.
.
send(foo.s[sizeof(double)]);

Tagli

kantirici, o şekilde istenilen sonucu alamazsın. String olarak göndermek her ne kadar verim olarak doğru bir yaklaşım olmasa da, tüm terminal programları ile ayrıca yazılım geliştirmeye gerek kalmaksızın okunabilir olması sebebiyle duruma göre tercih edilebilir. Baran Ekrem'in bu sebeple string göndermeyi tercih ettiğini sanıyorum. Senin yaptığın şey veriyi text olarak değil binary olarak gönderiyor. O durumda da ben union yazmaktansa, pointer dönüştürerek göndermeyi tercih ederdim. Aynı yere çıkmakla birlikte bence daha okunabilir bir kod olurdu.
Gökçe Tağlıoğlu

muhittin_kaplan

Bu aralar struct olarak göndermeyi deniyorum
(sağolsun ashes yardım ediyor- geçmiş zaman gerbay bir gün string gönderdiğimi öğrenince "hocam sende dumanla haberleşiyormussun demişti-)

z

ASCI haberleşmenin avantajları da var. Elinin tersiyle hemen itelememek lazım.

Verileri ASCI yaparak gönderdiğimizde 1 byte veride saklanabilecek max değer olan 255 (0x32, 0x35, 0x35) 3 Decimal ASCI karaktere yada 2 adet (0x46 0x46) hex ASCI karaktere dönüşür.

Trafiği artırdığı için hoş değil. Fakat veri paketlerinin çok fazla olmadığı daha da önemlisi paketlerin  fasılalı fasılalı gittiği ve çok gürültülü ortamlarda elinizde dünya   özel kontrol amaçlı kullanılabilecek karakteriniz olur.

Mesela

0...9,A..F hex veri iletimi için alı konan değerler
0x10...0xFF özel karakterler.

Mesela

0x10 Hoop veri yanlış alındı bir daha yolla
0x11 Tamadır sonrakine geç
0x12 Dur dur yollama
....
....

Fakat mesela 32 bitlik integer değişken printf ile dekore edilip seri porttan yollanıyorsa bu evet dumanla haberleşmekten farksız.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com