String yollama fonksiyonu

Başlatan baran123, 17 Mayıs 2015, 17:11:19

baran123

Amaç gelen bir data olduğun bilgi alındı gibi bir cevap vermek.Yazdığım fonksiyonda sadece cevabın 2 karakterini yolluyor.Sanırım değişkenler ile ilgili bir hata yapıyorum.

Şöyle bir şey yaptım.
static void Send_String(char *__string)
{
    static uint8_t __string_length;

    for(__string_length = 0; __string[__string_length] != 0; __string_length++)
    {
        USART_SendData(USART1, __string[__string_length]);
    }
}

/**
  * @brief  This function handles USART exception.
  * @param  None
  * @retval None
  */
void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        __Receive_Data = USART_ReceiveData(USART1);

        if(__Receive_Data)
            __Receive_Data = 1;
        else
            __Receive_Data = 0;

        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        Send_String("Data Recieved");
    }
}


Bu arada şu hiç hoşuma gitmiyor.
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

Burada while kullanmak iyi değil galiba ? Başka bir kullanım şekli var mıdır ? mesela for ile yapsak ?

Gökhan BEKEN

Baran bunu sen mi yazdın, ne gerek vardı?
       __Recieve_Data = USART_ReceiveData(USART1);

        if(__Recieve_Data)
            __Recieve_Data = 1;
        else
            __Recieve_Data = 0;


değişken 0'dan farklı ise 1' eşitliyorsun, 0 ise 0'a eşitliyorsun. Bunu hangi dava uğruna yaptın :D

Ayrıca kesme içerisinde iken
Send_String("Data Recieved");

yapıyorsun, kesme içinde iş yapılmaz!!!


for ile şöyle olabilir:
for(;;){
   if(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != RESET)break;
}


Denemedim ama belki şöyle de olur:
for ile şöyle olabilir:
for(;USART_GetFlagStatus(USART1, USART_FLAG_TXE)== RESET;);



Amacın gelen veriyi basmak ise, kesmeye her girdiğinde 1byte'ı alır basarsın zaten.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

Ondan önce başka bir değişken vardı düzeltmeyi unuttum.Öyle bir hata için döverler, düzelttim :)

Biliyorum hocam öyle bir şeyi sadece deneme amaçlı yaptım.Herhangi bir data alındığında String şeklinde bir cevap yollamak istiyorum fakat göndereceğim mesajın sadece ilk 2 karakterini gönderiyor.


mufitsozen

#3
Alıntı yapılan: Baran Ekrem - 17 Mayıs 2015, 17:49:29
Ondan önce başka bir değişken vardı düzeltmeyi unuttum.Öyle bir hata için döverler, düzelttim :)


Sayin @Baran Ekrem, hic değilse :
__Recieve_Data = (__Recieve_Data) ? 1:0;


yazsaydiniz acemilere ornek olurdu netekim!

(bu bahis konusu __Recieve_Data aslinda __Receive_Data olmasin sakin? onek olan '__' bunun bir implementation dependent variable(compiler'in kendi kullandigi) oldugunu soyluyor da!

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

baran123

#4
Hocam bu bildiğimiz if else demi ?

if (__Receive_Data)
{
   __Receive_Data = 1;
}
else
{
   __Receive_Data = 0;
}
//yukarıdaki ile aşşağıda ki aynı
__Receive_Data= (__Receive_Data) ? 1 : 0;


mesaj birleştirme:: 17 Mayıs 2015, 18:08:38

Değişkenlere öyle bir şey yapıyorum mesela fonksiyona string yazmak istesem hemen tanıyacak mavi olacak bende __ yada _ yapınca benim string gibi oluyor.Şimdilik bu hataları görmeyebiliriz.Biliyorum rezil biriyim :D

mufitsozen

#5
Alıntı yapılan: Baran Ekrem - 17 Mayıs 2015, 18:06:37
Hocam bu bildiğimiz if else demi ?

if (__Recieve_Data)
{
   __Recieve_Data = 1;
}
else
{
   __Recieve_Data = 0;
}
//yukarıdaki ile aşşağıda ki aynı
__Recieve_Data= (__Recieve_Data) ? 1 : 0;


C kitabinin 'ternary operator' bahsinden bizahmet '?:' bakiniz.
http://en.wikipedia.org/wiki/%3F:#C
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

baran123

Buldum teşekkürler :)



mesaj birleştirme:: 17 Mayıs 2015, 18:25:40

sizin linkdeki örnek daha detaylıymıs bene 1 tane örneği var sadece