probleme de pointeurs, actions sur un tableau
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

probleme de pointeurs, actions sur un tableau



  1. #1
    electroniXien

    probleme de pointeurs, actions sur un tableau


    ------

    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():
    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():
    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;
    }
    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].

    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..

    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;
    }
    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.

    Avez vous des idées?
    Merci beacoup pour votre aide, bonne année et bonne journée à tous !!!!

    -----
    Dernière modification par Jack ; 06/01/2015 à 11h21. Motif: Ajout balises code

  2. #2
    Jack
    Modérateur

    Re : probleme de pointeurs, actions sur un tableau

    Merci d'ajouter les balises code conformément aux recommandations de ce forum (c'est quand même plus lisible, non?):

  3. #3
    electroniXien

    Re : probleme de pointeurs, actions sur un tableau

    Ouuups, désolé :/
    Merci Jack

  4. #4
    Jack
    Modérateur

    Re : probleme de pointeurs, actions sur un tableau

    Pourquoi tu t'embêtes à convertir de l'hexadécimal en binaire, ça n'a aucun sens. la base n'est qu'une façon de représenter un nombre, la valeur restant la même.
    Voilà comment faire:
    Code:
        unsigned char buff[] = {0x00, 0x00, 0xFF, 0XFE, 0X87};
        unsigned char buff2[10]; // contient les 10 quartets issus des 5 octets de buff
    
    
        for (int i=0; i<5; i++) {
            buff2[2*i] = (buff[i] >> 4) & 0x0f;
            buff2[2*i + 1] = buff[i] & 0x0f;
        }

  5. A voir en vidéo sur Futura
  6. #5
    electroniXien

    Re : probleme de pointeurs, actions sur un tableau

    Waaaaa pas mal !!!

    J'avoue que je n'ai pas cherché à comprendre tout dans le détail, mais ca marche du feu de dieu .

    Merci Beaucoup !!!!

    Si je peux me permettre, connaissez vous ce type format de données?
    Nom : 2015-01-06_13h44_18.png
Affichages : 67
Taille : 32,2 Ko

    Les données que je lis sur 3 octets sont au format S.23
    J'ai compris que ainsi, la valeur lue sera comprise entre -1 et 1 avec une grande précision, que le bit de poids fort est le bit de signe (comme pour un négatif classique), et que le format est de type:
    BIT | MSB | | | | LSB
    | | | | |
    | bit de signe | 2-1 | 2-2 |............. | 2-23

    Il me semble que les négatifs sont gérés par le type unsigned, mais le format de donnée S.23 n'est pas beaucoup documenté sur internet, il doit etre propre a ce composant...

    Je pourrai faire la conversion moi meme dans une fonction, mais il me parait etrange de ne pouvoir convertir la donnée en négatif classique...


    Merci encore pour votre aide, et désolé si j'abuse avec mes questions, je me débrouillerai si je vais trop loin avec mes demandes...

    Bonne année !!

  7. #6
    electroniXien

    Re : probleme de pointeurs, actions sur un tableau

    ouups la representation du tableau n'est pas passée à l'affichage :/

    Nom : 2015-01-06_13h58_29.png
Affichages : 64
Taille : 6,1 Ko

    Merci

  8. #7
    Jack
    Modérateur

    Re : probleme de pointeurs, actions sur un tableau

    J'avoue que je n'ai pas cherché à comprendre tout dans le détail
    C'est un tort. La maîtrise des opérateurs logiques est une obligation dans ce type de programmation bas niveau. Il n'y a rien de bien sorcier à comprendre ce qu'est un ET logique ou un décalage.
    connaissez vous ce type format de données?
    Non
    Il me semble que les négatifs sont gérés par le type unsigned,
    ??? unsigned veut dire NON signé
    mais le format de donnée S.23 n'est pas beaucoup documenté sur internet, il doit etre propre a ce composant...
    Possible, mais comme on ne connait pas le composant ...
    Je pourrai faire la conversion moi meme dans une fonction, mais il me parait etrange de ne pouvoir convertir la donnée en négatif classique...
    Quel est le problème? Tout est expliqué dans tes pièces jointes. Il suffit de faire le calcul dans une fonction qui renverra le résultat dans un float ou un double.
    Dernière modification par Jack ; 06/01/2015 à 13h11.

  9. #8
    electroniXien

    Re : probleme de pointeurs, actions sur un tableau

    Bonjour,

    Je comprends les opérateurs logiques, mais les utiliser sur un autre type de variables que des binaires m'a toujours troublé dans la comprehension.
    Apres avoir pris du temps, j'ai compris ton code (c'est vrai que ce n'est pas sorcier, mais il faut prendre le temps.. )

    J'ai fini ma fonction de conversion S.23 en signé, je peux la mettre à disposition si necessaire..

    Bonne journée à tous

  10. #9
    Jack
    Modérateur

    Re : probleme de pointeurs, actions sur un tableau

    Je comprends les opérateurs logiques, mais les utiliser sur un autre type de variables que des binaires m'a toujours troublé dans la comprehension
    Attention, en C/C++, les opératuers logiques et binaires sont différents. Par exemple, pour un ET, & et 11 n'ont pas le même comportement.

    En tout cas, bravo pour avoir cherché à comprendre le code et avoir atteint ton objectif
    Dernière modification par Jack ; 12/01/2015 à 14h15.

Discussions similaires

  1. Problème sur les actions de groupes
    Par jules345 dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 12/01/2013, 14h21
  2. Petit problème en C (pointeurs et fonctions)
    Par invitee724cc92 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 09/02/2011, 09h24
  3. Problème exercice C (pointeurs)
    Par invite0dcfc647 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 23/09/2010, 10h20
  4. tableau et pointeurs c++
    Par invite0422bf25 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 11/12/2009, 17h50
  5. C : Problème avec des pointeurs sous MicroC/OS II
    Par invitef1d0ad93 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 01/11/2008, 17h06