struct, union vs.

Başlatan 8051-ARM, 17 Temmuz 2017, 17:49:11

8051-ARM

Merhaba Arkadaşlar,

Bu kodlar ile istediğim veriyi eeproma yazdırabiliyorum.

uint8_t  Ad[32], Soyad[32], No[4];	

void eeprom_yaz (void)
{ 
	HAL_SPI_Transmit(&hspi2, Ad, 32, 1);
	HAL_SPI_Transmit(&hspi2, Soyad, 32, 1);
	HAL_SPI_Transmit(&hspi2, No, 4, 1);	
}


Fakat ben bunları tek seferde yazdırmak istersem struct, union vs ile nasıl  yazdırabilirim.

void eeprom_yaz (void)
{ 
	HAL_SPI_Transmit(&hspi2, xxx, 68, 1);
}


OptimusPrime

struct
{
uint8_t  Ad[32], Soyad[32], No[4];
}xxx;


void eeprom_yaz (void)
{ 
	HAL_SPI_Transmit(&hspi2, (void *)&xxx, 68, 1);
}


dene bakalim
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

8051-ARM

Alıntı yapılan: OptimusPrime - 17 Temmuz 2017, 19:39:51
struct
{
uint8_t  Ad[32], Soyad[32], No[4];
}xxx;


void eeprom_yaz (void)
{ 
   HAL_SPI_Transmit(&hspi2, (void *)&xxx, 68, 1);
}


dene bakalim


Hocam öncelikle cevabınız için teşekkürler burası hariç "(void *)" denemiştim hata veriyordu sabah ilk iş deneyeceğim.

OptimusPrime

https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

baran123

Bir örnek de benden.
#include <stdio.h>
#include <stdlib.h>

#define LEN_OF_DATA1        (2)
#define LEN_OF_DATA2        (2)
#define LEN_OF_DATA3        (4)

#define LEN_OF_DATA_TEMP    (LEN_OF_DATA1 + LEN_OF_DATA2 + LEN_OF_DATA3)

typedef union
{
    struct {
        int temp[LEN_OF_DATA_TEMP];
    };
    struct {
        int data1[LEN_OF_DATA1]; 
        int data2[LEN_OF_DATA2]; 
        int data3[LEN_OF_DATA3]; 
    };
}DataPacket_t;

void HAL_SPI_Transmit(int buf[], int len)
{
    int i;
    
    for (i = 0; i < len; i++)
    {
        printf("%d\n\r", buf[i]);
    }
}

int main(void) 
{
    DataPacket_t myDataPacket;
    
    myDataPacket.data1[0] = 10;
    myDataPacket.data1[1] = 11;
    
    myDataPacket.data2[0] = 12;
    myDataPacket.data2[1] = 13;
    
    myDataPacket.data3[0] = 14;
    myDataPacket.data3[1] = 15;
    myDataPacket.data3[2] = 16;
    myDataPacket.data3[3] = 17;
    
    HAL_SPI_Transmit(myDataPacket.temp, LEN_OF_DATA_TEMP);
    
    return (0);
}

8051-ARM


@OptimusPrime


Hata veriyordu hocam şimdi sıkıntı yok sormadan önce özellikle yapıları inceledim yapının tümüne erişimde başarılı olamadım  "(void *)" bu şekilde bir örnekte görmedim tekrardan çok teşekkür ederim.


@baran123

Hocam sizin verdiğiniz örnek ve cevap içinde çok teşekkür ederim.



yldzelektronik

#6
@OptimusPrime  bir sorum var.


HAL_SPI_Transmit


fonksiyonu sanki uint8_t * alıyordu. Bu durumda void * olarak değil de uint8_t * olarak cast etsek ne olur?Hangisi daha doğru?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

@yldzelektronik
uint8_t* tipinden parametre aliyorsa uint8_t* ye donusturulse daha iyi olur fakat void* de gecerlidir. void* kisaca benim elimden bu geliyor sen neye donusturmek istiyorsan donustur kullan. adresini biliyorsun diyorsun, demek. buna uyari verebilir ama kizmasini anlayamadim.


@8051-ARM
kolay gelsin
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||