C code help !

Başlatan armsistem, 12 Şubat 2012, 23:30:31

armsistem

Arkadaşlar merhaba , aşağıdaki kodları anlayamadım yardımlarınızı bekliyorum.


- Usart_Oku başında ünlem fonksiyonu değilliyormu ? Mantığını çözemedim.
- Usart_Oku fonk. bana uarttan okunan veri döndürmesi gerekiyor bu satırın anlamı nedir.
Usart_Oku(&veri,PortNum));


Açıkçası aşağıdakileri küllüm anlamadım.

main.c

uint8_t veri;

 while(1){
	while(!Usart_Oku(&veri,PortNum));
  	lcd_gotoxy(2,1);
	lcd_yaz("                ");
  	lcd_gotoxy(2,1);
	veri_yolla(veri);
	while(Usart_Oku(&veri,PortNum))
	veri_yolla(veri);
	}





uart.c
uint8_t Usart_Oku(uint8_t *veri,uint8_t PortNum)
 {
	uint32_t say;

if( PortNum == 0 ) {

	 while(UART0Count==UART0CountOku){
	 say++;
	 if(say==5000)return( FALSE );
	 }	 
	 *veri=UART0Buffer[UART0CountOku];	 
	 if(UART0CountOku == BUFSIZE)UART0CountOku=0;	 
	 UART0CountOku++;

	 return (TRUE);
}
else if( PortNum == 1 ){

	 while(UART1Count==UART1CountOku){
	 say++;
	 if(say==5000)return( FALSE );
	 }	 
	 *veri=UART1Buffer[UART1CountOku];	 
	 if(UART1CountOku == BUFSIZE)UART1CountOku=0;	 
	 UART1CountOku++;

	 return (TRUE);
	}
else if( PortNum == 3 ){

	 while(UART3Count==UART3CountOku){
	 say++;
	 if(say==5000)return( FALSE );
	 }	 
	 *veri=UART3Buffer[UART3CountOku];	 
	 if(UART3CountOku == BUFSIZE)UART3CountOku=0;	 
	 UART3CountOku++;

	 return (TRUE);
	}
return ( FALSE );
}
}

justice_for_all

#1
Usart_Oku(&veri,PortNum));

burda fonksiyon sana true or false deger donduruyo yani  deger okunduysa true okunmadiysa false deger donduruyor.


unlemin anlami ise gelen veri true false hangisi oldugunu kontrol ediyor.yani unlem varsa false geldiyse demek unlem yoksa true geldiyse demek.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

armsistem

Hocam yanıt için sağol , normalde program uarttan veriyi okuyup lcdye yazması gereken bir programdır diye fikir yürütüyorum.
while(!Usart_Oku(&veri,PortNum));
Doğrumudur doğruysa mantığı nedir.

justice_for_all

verdigin satırda parantez ici dogru olana kadar bekle diyo yani uarttan veri okuyana kadar bekle diyor.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

armsistem

O satırı anladımda aşağıdaki satırlara inceleyebilirmiyiz.
while(1){
    while(!Usart_Oku(&veri,PortNum));// veri true olana kadar bekle
  	lcd_gotoxy(2,1);  //lcd satıra git
    lcd_yaz("                ");//boş yaz
  	lcd_gotoxy(2,1);//lcd satıra git
    veri_yolla(veri);// işte burasını anlamıyorum  veri değişkenini nereden çekiyor
    while(Usart_Oku(&veri,PortNum)) // ve burası veri değişkeni main satırında unsigned int 8 olrak tanımlı nasıl pointer muamelesi görüyor.
    veri_yolla(veri);
    }

justice_for_all

#5
Usart_Oku(&veri,PortNum) bu fonksiyonda zaten usarttan gelen veriyi veri degişkenine yazıyor.sonra usarttan gelen veriyi tekrar usarttan gonderiyor.

veri pointer mumalesi gormuyor usartoku fonksiyonunda verinin adresini yollanıyor usart oku fonksiyonunda pointer o adrese usarttan gelen veriyi yazıyor olay bu
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

armsistem

justice_for_all arkadaşım , veri değişkenin başındaki and işareti anlamı nedir.

Usart_Oku(&veri,PortNum));

M_B

Alıntı yapılan: armsistem - 14 Şubat 2012, 17:15:34
justice_for_all arkadaşım , veri değişkenin başındaki and işareti anlamı nedir.

Usart_Oku(&veri,PortNum));


Veri değişkenin adresini gösterir.
Hocam pointer kavramını inceleyin.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

elektronikhobi

Alıntı yapılan: armsistem - 14 Şubat 2012, 17:15:34
veri değişkenin başındaki and işareti anlamı nedir.

Usart_Oku(&veri,PortNum));


veri'nin adresi.

uint8_t Usart_Oku(uint8_t *veri,uint8_t PortNum)

işlevine baktığımız zaman bir uint8_t döndürüyor. İlk parametresi bir gösterge. Nasıl bir gösterge?
uint8_t tipindeki bir değişken için gösterge.  Büyük ihtimal bu uint8_t işaretsiz 8 bitlik bir tamsayıdır. Yani 0 - 255 arasında değer alabilir.

Göstergeler değişkenin adresini tutarlar. Bu yüzden gösterge istenen bir yerde direkt olarak değişkenin adresini de gönderebilirim. Aynı şey.

Gene bir dizinin ismi o dizinin adresini tutar.

    char harfler[10];
    char * gosterge = harfler;


Göstergeler de adres gösterdiğine göre bir dizinin ismini bir göstergeye atayabiliriz. O zaman göstergemiz harfler'in ilk elemanını gösteriyor.

Peki neden gösterge kullanmaya ihtiyaç duyarız? Bunun nedeni eğer işlevin değişkenler üzerinde değişiklik yapmasını istiyorsak, işleve göndereceğimiz parametreleri gösterge olarak seçeriz. Örneğin:

#include <stdio.h>

void yerDegistir(int * a, int * b)
{
    int gecici = *a;
    *a = *b;
    *b = gecici;
}


int main()
{
    int a = 4,  b = 1;
    printf("sayilar degismeden önce a : %d b : %d\n", a, b);

    yerDegistir(&a, &b);
    printf("sayilar yerdegistirdikten sonra a : %d b : %d\n", a, b);

}


Şimdi eğer yukarıdaki yerDegistir işlevinde gösterge kullanmasaydık bu a ve b değişkenlerinin değerini değiştiremeyecektik. Programı gösterge kullanmadan deneyiniz ve aradaki farkı görün.

armsistem

teşekkürler yanıtlar için.