fonksiyonu anlamadım :(

Başlatan armsistem, 22 Haziran 2012, 00:18:20

armsistem

Arkadaşlar merhaba , aşağıda nxp nin sitesinden indirdiğim pdf dosyasında bir fonksiyon var fakat anladığım kadarıyla fonksiyon olarak snr değer döndürüyor. Bu fonksiyonun kullanımı nasıldır.

- *snr fonksiyona değer göndermek için kullanmıyormuyuz ? Nasıl geri değer döndürecek.


Command Set  MF RD 700
3.1.2.2 PcdGetSnr
signed char PcdGetSnr (unsigned char * snr)
Cmd-Code:  0x22
IN 
OUT   snr (4)
Parameters:
snr   (OUT)  4 bytes serial number of the reader IC 
Returns:
MI_OK
This function reads out 4 bytes serial number of the reader IC. The serial number is unique for all
delivered readers.

Komut dizini aşağıda
char PcdGetSnr(unsigned char* snr)
{
   signed char status;
   status = PcdReadE2(0x08,0x04,snr);
   return status;
}


3.1.2.3 PcdReadE2
signed char PcdReadE2 (unsigned short startaddr, 
           unsigned char length, 
           unsigned char * data)
Cmd-Code:  0x23
IN   startaddr (2) length (1)
OUT   data (length)
Parameters:
startaddr   (IN)  EEPROM memory start address, Defines the start address  for the read
operation   
length    (IN)  number of data bytes to read 
data    (OUT)  is a pointer to the length bytes long data buffer, to store the read data. 

cicjoe

#1
hocam anladigim kadari ile, okuma islemi sonucu ID degeri sizin fonksiyona gonderdiginiz parametre ile size geri donuyor. okuma isleminin basarili olup olmadigi ise status ile donuyor. ornegin:

unsigned char data[4];

if (PcdGetSnr(data))   //veya PcdGetSnr(data) == MI_OK
	printf("%s", data);   // %d ile sayisal yazdirmak daha anlamli olabilir tek tek 4'luk array seklinde (4 byte doner demis)
else
	printf("okuma basarisiz");

bu sekilde calisir gibime geldi.

Alıntı yapılan: armsistem - 22 Haziran 2012, 00:18:20
- *snr fonksiyona değer göndermek için kullanmıyormuyuz ? Nasıl geri değer döndürecek.

adres olarak gectiginiz icin deger dondurebilir. yani sizin gonderdiginiz degiskeni degistirirse, sizin degiskende degisir. scanf fonksiyonu gibi.

fonksiyon, diger 2 parametreyi siz gondermeyin diye 2 tane ic ice fonksiyon sekline getirilmis. bence bosuna stack'tan yiyo gibi. macro tanimlayabilirsiniz, eger muhimse sizin icin.

#define GetSnr(snr)    PcdReadE2(0x08,0x04,snr);

veya inline yapabilirsiniz.

Donen seri numarasini da 4 elemanli dizi yerine 4byte'lik degiskene tasirsaniz bitleri kaydirarak, diger seri numaralari ile karsilastirirken veya bir yere gonderirken daha rahat edebilirsiniz sanki.

yamak

snr'yi pointer olarak tanımlamış çünkü muhtemelen PcdReadE2 fonksinunda snr nin değerini değiştiriyodur. Yani PcdGetSnr fonksiyonu geriye status diye bi değer döndürüyo fakat snr nin değerini de değiştirmiş oluyo. Zaten fonksiyonun asıl amacı da bu snr'ye yeni değer kazandırmak. Eğer bir fonksiyona bir değişkenin adresini gönderirsek o değişkenin değerini o fonksiyon içinde değiştirebiliriz. Buna return by reference deniliyor. Adresini değil de değişkenin kendisini  gönderirsek bu sefer değişkenin değeri kopyalanır fonksiyonun bitiminde yine eski değerini alır. Bu yüzden bir değişkene bir fonksiyon içinde yeni değer kazandırmak istersek fonksiyona o değişkenin adresini göndermeliyiz.