Bonjour à tous !
Apres quelques jours de recherches, je vient vers vous pour éclairer ma lanterne sur un problème de pointeurs/tableau en C.
Je suis sur Raspberry PI, et lit en SPI les registres d'un module de mesure de conso.
Le resultat de la lecture est stocké dans un tableau "buff".
Chaque case du tableau contient 2 quartet en hexadecimal, et le total des données à exploiter sont sur 3 octets (24 bits).
Mon probleme est que je n'arrive pas à séparer les digits du contenu de mes cases pour recuperer le mot de 3 octets dans un tableau de 6 cases (1 par quartet)
Avec un peu de code, ca donne cela:
Pour mon main():
la fonction lire_instantaneous_Active_Powe r_x():Code:#include <bcm2835.h> #include <stdio.h> #include "math.h" #include <string.h> #define SIZE_OF_BUFF 5 static int myFd ; char buff[SIZE_OF_BUFF]; //Prototypes int lire_calibration(); int lire_gain_S1(char source); int lire_Active_Power_x(char source); int lire_instantaneous_Active_Power_x(char source); int hex_binary(char hex[]); int main(int argc, char **argv) { const int channel = 0; const int speed = 1000000; if (!bcm2835_init()) { return 1; } else { printf("Initialisation done !!!\n"); } bcm2835_spi_begin(); bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); // The default bcm2835_spi_setDataMode(BCM2835_SPI_MODE3); // The default bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default bcm2835_spi_chipSelect(BCM2835_SPI_CS0); // The default bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); // the default // Send a byte to the slave and simultaneously read a byte back from the slave // If you tie MISO to MOSI, you should read back what was sent lire_instantaneous_Active_Power_x('A'); bcm2835_spi_end(); bcm2835_close(); return 0; }
La fonction lire_instantaneous_Active_Powe r_x envoie les 2 octets de commande buff[0] et buff[1], et ecrit la valeur lue dans les cases buff[2, 3, 4].Code:int lire_instantaneous_Active_Power_x(char source) { if((source != 'A') && (source =! 'B')) { printf("Mauvais indice, veuillez entrer les valeurs A ou B\n"); return 1; } if(source == 'A') { //buff = { 0x01, 0x70, 0x00, 0x00, 0x00}; //Instantaneous Active Power A address 5C -> 01 011100 00 -> 0x70 buff[0] = 0x01; buff[1] = 0x70; buff[2] = 0x00; buff[3] = 0x00; buff[4] = 0x00; } else { //buff = { 0x01, 0x74, 0x00, 0x00, 0x00}; //Instantaneous Active Power B address 5D -> 01 011101 00 -> 0x74 buff[0] = 0x01; buff[1] = 0x74; buff[2] = 0x00; buff[3] = 0x00; buff[4] = 0x00; } printf("Sent to SPI for Instantaneous Active Power %c: %02X, %02X\n", source, buff[0], buff[1]); bcm2835_spi_transfern(buff, sizeof(buff)); printf("Instantaneous Active Power %c value (hex): %02X, %02X, %02X\n", source, buff[2], buff[3], buff[4]); int res = conversion_S23(); printf("Instantaneous Active Power %c value (dec): %d\n", source, res); return res; }
A partir de ce moment, je n'arrive pas a accéder au contenu de ces cases autrement que avec la fonction printf() dans ma fonction conversion:
Les données sont du type : buff[] = [0x00, 0x00, 0xFF, 0XFE, 0X87], et je souhaite les mettre par quartet au format [0x0, 0x0, 0x0, 0x0, 0xF, 0xF, ..., 0x8, 0x7] afin de pouvoir effectuer une conversion en binaire..
J'ai essayé plusieurs methodes, mais il me semble que tant que je ne peut séparer les quartets pour les stocker dans une autre tableau avant conversion, je ne pourrait convertir et interpreter mon resultat.Code:int conversion_S23() { char octet_MSB = buff[2]; printf("%X\n", octet_MSB); char essai[2] = octet_MSB; printf("valeur recue pour la conv : %x", octet_MSB); //Fonction de conversion de l'hexa au binaire int i, length, decimal=0, binary=0; for(length=0; essai[length]!='\0'; ++length); for(i=0; essai[i]!='\0'; ++i, --length) { if(essai[i]>='0' && essai[i]<='9') decimal+=(essai[i]-'0')*pow(16,length-1); if(essai[i]>='A' && essai[i]<='F') decimal+=(essai[i]-55)*pow(16,length-1); if(essai[i]>='a' && essai[i]<='f') decimal+=(essai[i]-87)*pow(16,length-1); } i=1; while (decimal!=0) { binary+=(decimal%2)*i; decimal/=2; i*=10; } printf("valeur envoyée apres conversion : %d", binary); return binary; }
Avez vous des idées?
Merci beacoup pour votre aide, bonne année et bonne journée à tous !!!!
-----