Pages: 1 [2] 3   Go Down
Author Topic: Gestion des variables / array avec arduino et divers types  (Read 3243 times)
0 Members and 1 Guest are viewing this topic.
France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Désolé c'est encore moi
Je tourne encore en rond à un endroit
malgré mes recherches je ne voie pas

donc j'ai ma structure sondes
Code:
typedef struct
{
  uint8_t adresse[8];
  char* nom_sonde;
  float temp_actuelle;
  float temp_min;
  float temp_max;
}
sondes_temp;

le fichier de configuration est lu par ligne et peuple les variables
mais je bloque pour l'adresse
0x28,0xC6,0x4D,0x21,0x04,0x00,0x00,0x57
J'ai voulu la décomposer en 8 pour remplir adresse
le résultat final devrait être équivalent à
Code:
sonde[0].adresse[0]= 0x28;     
 sonde[0].adresse[1]=      0xC6;
sonde[0].adresse[2]=      0x4D;
sonde[0].adresse[3]=      0x21;
sonde[0].adresse[4]=      0x04;
sonde[0].adresse[5]=      0x00;
sonde[0].adresse[6]=      0x00;
sonde[0].adresse[7]=      0x57;
(codé en dur)
mais une fois de plus je coince
le code qui décompose la ligne est
Code:
char *p = textBuffer;
char *str;
int itr= 0;
while ((str = strtok_r(p, ",", &p)) != NULL){

ensuite j'ai essayé des
sonde[0].adresse= str;
sonde[0].adresse=(uint8_t *)(str);
ou encore
strcpy( sonde[0].adresse, (uint8_t *)str );

mais je ne voie pas
j'ai changé les types
mais j'ai toujours des
"invalid conversion from 'uint8_t*' to 'const char*'"
ou
" cast from 'char*' to 'uint8_t' loses precision"




Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon j'ai fait une ou deux modifs :
Code:
typedef struct
{
  DeviceAddress adresse;
  char* nom_sonde;
  float temp_actuelle;
  float temp_min;
  float temp_max;
}
sondes_temp;
Code:
             char *p = textBuffer;
              uint8_t *str;
              int itr= 0;
              while ((str = (uint8_t *)strtok_r(p, ",", &p)) != NULL){
                sonde[0].adresse[itr]= str;
                itr++;
              }

Mais maintenant j'ai
"invalid conversion from 'uint8_t*' to 'uint8_t'"
sur
"sonde[0].adresse[itr]= (uint8_t *)str;"


« Last Edit: September 19, 2012, 11:53:55 am by Aqua-Passion » Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Vu que tu ne nous dis pas ce qu'est DeviceAddress , ca va pas être facile.

Fait attention avec les pointeurs.
Il faut vraiment que tu creuses le C et les pointeurs car c'est très différents de ce que tu a pu connaitre en PHP.
Un pointeur est une variable qui contient une adresse en mémoire. Il fautq ue cette adresse ait été allouée, que tu sot sure qu'il y ait quelque chose derrière et que ca ne va pas disparaître tout seul.

Par exemple tu crée une variable p qui pointe vers textBuffer. Qu'est-ce que textbBuffer ?
Supposons que tu as char textBuffer[10]
Dans ce cas textBuffer est un tableau de caractère. Il est alloué en mémoire et il existe.
Donc p pointe vers le 1er caractère de textBuffer
Ton usage de strtok_r() est syntaxiquement correct mais peut être fonctionnellement incorrect.
Il ne faut pas oublier que p va :
- prendre des valeurs qui sont des adresses mémoires situées dans textBuffer
- la fonction strtok_r modifie le contenu de textBuffer
- tu va peut être réutiliser textBuffer plus loin dans ton code

sonde[0].adresse[itr]= str;
str est un pointeur sur char
Sans savoir de quoi est fait addresse, je ne peux pas conclure

Donne plus de code


Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai un peu regardé sur le net mais pour les pointeurs mais c'est pas pratique de comprendre sur le net tout seul
pas encore eu le temps d'aller voir pour le bouquin je pense que je vais attendre le mois prochain pour l'acheter ce mois ci c'est un peu juste :-p

Je n'ai pas saisi si il était possible d'éviter d'utiliser les * ou de passer de char* à char pas exemple
depuis le début dès que j'essayais avec juste char j'ai des erreurs à la compilation

par exemple dans struct j'ai "char* nom_sonde;"
si j'essaye "char nom_sonde;" à la place j'ai une erreur à "myGLCD.print(sonde[0].nom_sonde,10,36);":
"invalid conversion from 'char' to 'const char*'"

sinon
DeviceAddress vient de
DallasTemperature.h :
"typedef uint8_t DeviceAddress[8];"

textbBuffer est une ligne de texte "file.readLn(textBuffer, 50);"
(tableau de caractère) normalement
Quote
file.readLn(buffer, bufSize);
Read the next line of text from an open text-file.
Parameters:   
buffer:       charArray to put the next line of text into
bufSize:       size of buffer in bytes
Returns:   Result as a word
Usage:   res = file.readLn(st, 80); // Attempt to read the line of text and return it in st
Notes:   
•   The result will be the length of the textline that are returned
•   If the buffer was to small it will be filled with all the text it could contain, and result will be BUFFER_OVERFLOW. It the end of the file was reached during the read result will be EOF
•   Result can also be FILE_IS_EMPTY, ERROR_NO_FILE_OPEN or ERROR_WRONG_FILEMODE



Je vais essayer de mettre un peu plus de code concerné mais vu que c'est une une mise au point c'est un peu fouillis faut que je réorganise/ nettoie /commente le code


Code:
#include <Wire.h>
#include <tinyFAT.h>
#include <UTFT.h>
#include <UTFT_tinyFAT.h>
#include <ITDB02_Touch.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Timer.h>
#include <tinyFAT.h>
#include <String.h>

Timer t;


// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 8

int ledalert = 9;
int buzzer = 10;

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

int x, y;
int n = 1;


typedef struct
{
  DeviceAddress adresse;
  char* nom_sonde;
  float temp_actuelle;
  float temp_min;
  float temp_max;
}
sondes_temp;

sondes_temp sonde[10];

// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];

...

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

....

byte res;
word result;
char textBuffer[81];

/***DEBUT SETUP *************************************************************************************************************************/
void setup(){
  Wire.begin();
  Serial.begin(9600);
  zero=0x00;
  dispHeure = String ();

  // initialize digital pin as output.
  pinMode(ledalert, OUTPUT);
  pinMode(buzzer, OUTPUT);

  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.clrScr();

  file.initFAT();
  myGLCD.setFont(BigFont);

  myTouch.InitTouch(LANDSCAPE);
  myTouch.setPrecision(PREC_MEDIUM);

  myGLCD.fillScr(255, 255, 255);
  myGLCD.setBackColor(153, 204, 255);
  myGLCD.loadBitmap(0, 0, 320, 240, "fond.raw");
  myGLCD.setColor(0, 0, 0);


  myGLCD.print("Carte Gestion bacs", CENTER, 5);
  myGLCD.setFont(SmallFont);


  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(Tempad1, 10);
  sensors.setResolution(Tempad2, 10);

  int tickEvent = t.every(1000, getDateDs1307tolcd);

  getSondesInfos();
  //Chargement SD
  delay(1000);

}
/*FIN SETUP *************************************************************************************************************************/

/*DEBUT LOOP ************************************************************************************************************************/
void loop(){
  //rafraich timer
  t.update();

  temptolcd();

...

  myGLCD.print(String(freeRam()),280,200);
  delay(1000);

}

/*FIN LOOP ************************************************************************************************************************/

void temptolcd(){
  sensors.requestTemperatures();
  float thistemp = printTemperature((uint8_t*)sonde[0].adresse);
  sonde[0].temp_actuelle = thistemp;

  Serial.println(sonde[0].temp_actuelle);


  myGLCD.print(sonde[0].nom_sonde,10,36); //

  myGLCD.printNumF( sonde[0].temp_actuelle,1,133,36); // temperature bac
  myGLCD.drawCircle(167,36,1); // Cercle degre bac  
  myGLCD.print("C",172,36); // "c" de temperature bac


  if (sonde[0].temp_actuelle > sonde[0].temp_max){
    myGLCD.loadBitmap(100, 26, 32, 32, "thermoal.raw");
    ledalertOn();
    buzzOn();
  }
  else if (sonde[0].temp_actuelle < sonde[0].temp_min){
    myGLCD.loadBitmap(100, 26, 32, 32, "thermof.raw");
    ledalertOn();
    buzzOn();
  }
  else {
    myGLCD.loadBitmap(100, 26, 32, 32, "thermo.raw");
    ledalertOff();
    buzzOff();
  }

  sensors.requestTemperatures();
  //lcd.print("Temp3: ");
  //printTemperature(Tempad2);
}

void buzzOn(){
  analogWrite(buzzer,128);
  delay(500);
  digitalWrite(buzzer, LOW);
  delay(500);
}

void buzzOff(){
  digitalWrite(buzzer, LOW);
}

void ledalertOn(){
  digitalWrite(ledalert, HIGH); // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(ledalert, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);  
}

void ledalertOff(){
  digitalWrite(ledalert, LOW);
}

...

float printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.println("Error getting temperature");
    printAddress(deviceAddress);
    return tempC;
  }
  else {
   return tempC;
  }

}

void getSondesInfos()
{
  //sonde[0].adresse = {0x28,0xC6,0x4D,0x21,0x04,0x00,0x00,0x57};
  //sonde[0].nom_sonde = "Temp test";
  //sonde[0].temp_actuelle = 21;
  //sonde[0].temp_min = 10;
  //sonde[0].temp_max = 26;
  int line=0;

  if (file.exists("temp1.txt"))
  {  
    res=file.openFile("temp1.txt", FILEMODE_TEXT_READ);
    if (res==NO_ERROR)
    {
      result=0;
      while ((result!=EOF) and (result!=FILE_IS_EMPTY))
      {
        line ++;
        result=file.readLn(textBuffer, 50);
        if (result!=FILE_IS_EMPTY)
        {
          if (result==BUFFER_OVERFLOW)
            Serial.print(textBuffer);
          else{

            if (line==2) {
              //Si ligne adresse
              Serial.println("ok 2 adr");
              char *p = textBuffer;
              uint8_t *str;
              int itr= 0;
              while ((str = (uint8_t *)strtok_r(p, ",", &p)) != NULL){ // delimiter is the semicolon
                Serial.print(itr);
                Serial.print("  :  ");
                Serial.print((char*)str);
                Serial.print("  ->  ");

                sonde[0].adresse[itr]= str;
                Serial.println((char*) sonde[0].adresse[itr]);
                itr++;
              }
            }
            else if (line==4) {
              //Si ligne nom sonde
              Serial.println("ok 4 nom");
              strcpy( sonde[0].nom_sonde, textBuffer );
            }

            Serial.print("Line :");
            Serial.println(line);
            Serial.println(textBuffer);
          }
        }
        else
          Serial.println("** ERROR: File is empty...");
      }
      Serial.println();
      file.closeFile();
    }
    else
    {
      switch(res)
      {
      case ERROR_ANOTHER_FILE_OPEN:
        Serial.println("** ERROR: Another file is already open...");
        break;
      default:
        Serial.print("** ERROR: ");
        Serial.println(res, HEX);
        break;
      }
    }
  }
  else{

    Serial.println("** ERROR: 'temp1.txt' does not exist...");
  }

  Serial.println("** sensor init...");
  printAddress(sonde[0].adresse);
  Serial.println("** sensor init... fin");
}

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 8) Serial.print("0");
    Serial.print(deviceAddress[i],HEX);
    Serial.print(" - ");
  }
}

J'ai enlevé des morceau c'était trop gros , ça ne passais pas
« Last Edit: September 19, 2012, 04:34:40 pm by Aqua-Passion » Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

la ligne
Code:
while ((str = (uint8_t *)strtok_r(p, ",", &p)) != NULL){
sert a décomposer la ligne texte de l'adresse :
Quote
0x28,0xC6,0x4D,0x21,0x04,0x00,0x00,0x57
dans le but de peupler la sonde dans cette optique:
               sonde[0].adresse[0]=      0x28;    
               sonde[0].adresse[1]=      0xC6;
               sonde[0].adresse[2]=      0x4D;
               sonde[0].adresse[3]=      0x21;
               sonde[0].adresse[4]=      0x04;
               sonde[0].adresse[5]=      0x00;
               sonde[0].adresse[6]=      0x00;
               sonde[0].adresse[7]=      0x57;

j'avais peur de pas pouvoir rentrer directement du genre sonde[0].adresse = {0x28,0xC6,0x4D,0x21,0x04,0x00,0x00,0x57}; en récupérant la ligne
Je me suis peut être compliqué la vie
« Last Edit: September 19, 2012, 04:30:05 pm by Aqua-Passion » Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon, tu as :

Code:
char textBuffer[81];
...
        result=file.readLn(textBuffer, 50);

Ca c'est ok. Tu as déclaré un tableau en variable globale, donc de la mémoire a été allouée. Je suis rassuré smiley-wink

Code:
              char *p = textBuffer;
              uint8_t *str;
              int itr= 0;
              while ((str = (uint8_t *)strtok_r(p, ",", &p)) != NULL){ // delimiter is the semicolon
                sonde[0].adresse[itr]= str;
              }

Là ca coince. Pourquoi ?

p est un pointeur sur une chaîne de caractères qui représente la valeur en caractères ASCII.
Par exemple "0x28".
Il ne faut pas confondre la valeur numérique 0x28 ou 40 en décimal, avec la représentation en caractères "0x28" ou "40"
Dans un cas la valeur numérique est un entier (non signé) suffisamment petit pour être stocké dans une variable de type uint8_t c'est à dire 1 octet.
Dans l'autre cas c'est une suite de caractères '0', 'x', '2', '8', '\0' (sans oublier le '\0' qui marque la fin de la chaîne) c'est à dire que si on regarde en mémoire les octets situés à partir de l'adresse pointée par le pointeur p, on verrait un octet à 0x30 (48 décimal), 0x78 (120), 0x32 (50), 0x38 (56) et finalement 0x00 (0).

Ta confusion vient du fait qu'en PHP il n'y a pas cette distinction de types.
En php, le code suivant est valide :
a = '4';
b = '5';
c = a + b;
et c vaut 9.

En, ca ne marche pas.

Or
Code:
typedef uint8_t DeviceAddress[8];
Ce que tu dois écrire dans adresse[itr] est l'entier dont la représentation en caractères est pointé vers p
Il faut explicitement faire une conversion.
Il n'y a pas de fonction simple pour traduire une chaine de caractère hexa précédée de "0x".
Par contre tu peux utiliser la fonction strtoul() en sautant le "0x" et en précisant la base 16 :

Code:
unsigned long strtoul ( const char * __nptr,
char ** __endptr,
int __base
)
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#gaea44aa48bda8261f794dcb2d1e7ab2b2

Ce qui donne :

Code:
#include <stdlib.h>
...
              while ((str = (uint8_t *)strtok_r(p, ",", &p)) != NULL){ // delimiter is the semicolon
                sonde[0].adresse[itr]= (uint8_t)strtoul( p+2, NULL, 16 );

Tu notera que puisque p pointe vers la chaine "0x28", p+2 pointe donc vers .... "28"

Bon courage.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci beaucoup ,
Je pense que ça je n'aurais pas trouvé tout seul
Je pense avoir compris le plus gros de ton explication mais chez moi le résultat n'est pas celui escompté
j'ai essayé de débuger
je sais pas nonplus si je fais comme il faut
voila le bout de code ( modifié et ajout de serial print)
Code:
            if (line==2) {
              //Si ligne adresse
              Serial.println("ok 2 adr");
              char *p = textBuffer;
              uint8_t *str;
              int itr= 0;
              while ((str = (uint8_t *)strtok_r(p, ",", &p)) != NULL){
                Serial.print(itr);
                Serial.print("  :  ");
                Serial.print((char*)str);
                Serial.print("  ->  ");

                sonde[0].adresse[itr]= (uint8_t)strtoul( p+2, NULL, 16 );

               Serial.println(sonde[0].adresse[itr]);
                itr++;
              }
Dans le sérial ça m'affiche
itr : str  -> sonde[0].adresse[itr]
voici le résultat dans le moniteur série
Quote
0  :  0x28  ->  0
1  :   0xC6  ->  0
2  :   0x4D  ->  0
3  :   0x21  ->  0
4  :   0x04  ->  0
5  :   0x00  ->  0
6  :   0x00  ->  0
7  :   0x57  ->  0
il semble que sonde[0].adresse[itr] ne soit pas bon et que l'info ait disparu
Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ah non je viens de voir
j'ai recopié
sonde[0].adresse[itr]= (uint8_t)strtoul( p+2, NULL, 16 );
mais en fait p c'est le "Textbuffer" ( tableau de caractères complet de la ligne ) -> contient 0x28,0xC6,0x4D,0x21,0x04,0x00,0x00,0x57
c'est plutôt avec str qu'il faut le faire je pense ? c'est lui qui contient le tableau de caractères de chaque élément 0x28 , puis 0xC6 etc ...
Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Exact
et d'ailleurs aucune raison que str soit en uint8_t* mais plutot en char
Ce qui donne :

Code:
#include <stdlib.h>

char textBuffer[80];

void setup()
{
  while( !Serial );
  Serial.begin(9600);

  // remplace le readln pour mon test rapide
  strcpy( textBuffer, "0x12,0x34,0x56,0x78,0x9A,0xBC" );

  char *p = textBuffer;
  char *str;
  // une boucle for permet de controler que tu ne dépasses pas le dernier index du tableau
  // sinon crac-boum (en C il ne faut pas dépasser les index de tableau. Le langage ne vérifie
  // pas et va écrire n'importe où, ce qu'on appelle "jardiner en mémoire"
  for ( int8_t itr = 0 ; itr < 8 ; itr++ )
  {
    str = strtok_r(p, ",", &p);
    if ( str != NULL )
    {
      Serial.print(itr);
      Serial.print("  :  ");
      Serial.print((char*)str);
      Serial.print("  ->  ");

      // j'ai pas la structire alors je fait juste un println
      // sonde[0].adresse[itr]= (uint8_t)strtoul( p+2, NULL, 16 );
      // Serial.println(sonde[0].adresse[itr]);
      Serial.println( strtoul( str+2, NULL, 16 ), HEX );
    }
    else
    {
      //sonde[0].adresse[itr] = 0;
    }
  }
}
               
void loop()
{
}
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L’exemple fonctionne impec
mais avec :
Code:
          if (line==2) {
              //Si ligne adresse
              Serial.println("ok 2 adr");//debut débug ligne adresse trouvée
              char *p = textBuffer;
              char *str;
              // une boucle for permet de controler que tu ne dépasses pas le dernier index du tableau
              // sinon crac-boum (en C il ne faut pas dépasser les index de tableau. Le langage ne vérifie
              // pas et va écrire n'importe où, ce qu'on appelle "jardiner en mémoire"
              for ( int8_t itr = 0 ; itr < 8 ; itr++ )
              {
                str = strtok_r(p, ",", &p);
                if ( str != NULL )
                {  // delimiter is the semicolon
                  Serial.print(itr);//Affiche le numéro d'élément (0-7)/8
                  Serial.print("  :  ");
                  Serial.print((char*)str);//Affiche le contenu de str
                  Serial.print("  ->  ");


                  //sonde[0].adresse[itr]= (uint8_t)strtoul( str+2, NULL, 16 );//peuple la variable

                  //Serial.println(sonde[0].adresse[itr]);//Affiche le contenu de la variable
                  Serial.println( strtoul( str+2, NULL, 16 ), HEX );//Affiche le contenu de l'élément final
                }
              }
            }

me retourne
Quote
ok 2 adr
0  :  0x28  ->  28
1  :   0xC6  ->  0
2  :   0x4D  ->  0
3  :   0x21  ->  0
4  :   0x04  ->  0
5  :   0x00  ->  0
6  :   0x00  ->  0
7  :   0x57  ->  0
le premier semble bon

je pense que ca bloque ici :
for ( int8_t itr = 0 ; itr < 8 ; itr++ )
non ?
str = strtok_r(p, ",", &p); est après

cela dit ca fonctionne dans ton exemple :-(



« Last Edit: September 20, 2012, 02:58:27 pm by Aqua-Passion » Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

question bête mais je me suis peut être compliqué la vie pour rien
il n'y a pas une manière plus simple
avec la ligne du fichier texte :
Quote
0x28,0xC6,0x4D,0x21,0x04,0x00,0x00,0x57
de faire en sorte que
Quote
sonde[0].adresse = {0x28,0xC6,0x4D,0x21,0x04,0x00,0x00,0x57};
(typedef uint8_t DeviceAddress[8];  )


on est peut être pas obligé de décomposer pour faire :
Quote
                sonde[0].adresse[0]=      0x28;      
                 sonde[0].adresse[1]=      0xC6;
                 sonde[0].adresse[2]=      0x4D;
                 sonde[0].adresse[3]=      0x21;
                 sonde[0].adresse[4]=      0x04;
                 sonde[0].adresse[5]=      0x00;
                 sonde[0].adresse[6]=      0x00;
                 sonde[0].adresse[7]=      0x57;
?
« Last Edit: September 20, 2012, 03:13:39 pm by Aqua-Passion » Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai finalement réussi à faire fonctionner avec
sonde[0].adresse[itr]= strtoul( str, NULL, 16 )
le résultat n'est pas visuellement celui espéré mais la fonction récupère bien la température
« Last Edit: September 20, 2012, 04:32:23 pm by Aqua-Passion » Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La seule chose que tu as changé c'est de re'mplacer str+2 par str ?

Sinon je confirme qu'il n'y a pas d'autre façon de faire en C que de décomposer. Tu est looooooooiiiiin du PHP.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France (80)
Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui , enfin presque :
(sauf idsonde c'est un ajout pour la gestion de plusieurs sondes)
Code:
             if (line==2) {
                int itr=0;
                //Si ligne adresse
                Serial.println("Ligne 2 adresse : ");//debut débug ligne adresse trouvée
                char *p = textBuffer;
                char *str;
                while ((str = strtok_r(p, ",", &p)) != NULL){
                  Serial.print(itr);//Affiche le numéro d'élément (0-7)/8
                  Serial.print("  :  ");
                  Serial.print(str);//Affiche le contenu de str
                  Serial.print("  ->  ");
                  sonde[idsonde].adresse[itr]= strtoul( str, NULL, 16 );//peuple la variable
                  Serial.println(sonde[idsonde].adresse[itr]); //Affiche le contenu de la variable
                  itr++;
                }
J'ai pas saisi toute la nuance mais ça fonctionne impec :-)

Sinon , oui en effet , très très loin du php , y'a au moins quelques palettes d'aspirine de différence lol

Mais bon j'ai appris le php tout seul et je me souviens , le début c’était chaud aussi
J'espère que ça va faire pareil , bon au début ça va piquer un peu plus mais après ça ira mieux :-)

Dès que je peux j'investi dans un bouquin

Niveau variables comparé au php c'est la misère
J'en ai encore fait les frais aujourd'hui ou je me retrouvais avec des débordement parce que j'avais pas défini la longueur de la variable je pense
Code:
typedef struct
{
  DeviceAddress adresse;
  char nom_sonde[20];
  float temp_actuelle;
  float temp_min;
  float temp_max;
}
sondes_temp;
Dur de trouver le défaut

J'ai pas encore bien saisi quand on utilise des variables et quand on utilise les pointeurs aussi






Logged

Cordialement, Stéphane
Administrateur Aqua-Passion.com

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un pointeur doit forcément pointer vers quelque chose.
Une variable est quelque chose.

Le bouquin de Kernighan et Ritchie existe en PDF mais uniquement en version anglaise : http://zanasi.chem.unisa.it/download/C.pdf

Sinon j'ai aussi trouvé un cours de C : http://www.istia.univ-angers.fr/~hardouin/cours_c.pdf

Et voir aussi le site du zéro : http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Pages: 1 [2] 3   Go Up
Jump to: