Go Down

Topic: Comment convertir un char en byte (Read 4708 times) previous topic - next topic

pierrot10

Bonjour à tous,

Je dois convertir un valeur en en byte.

Quand je tape dans mon termine dird3,
je dois recupérer le 3. Pour cela je fais comme ceci
Code: [Select]

if(!strncmp(inSerial,"dird",3)){
      #ifdef DEBUG
        Serial.println(F("DELETE IN THE PHONE DIRECTORY"));
        Serial.println(F("--------------------------------"));
        Serial.println(F("In progress, wait..."));
      #endif

       // Ici j'affiche le trois
       Serial.println(inSerial[4]);

      //En suite j'ai besoin de ce trois pour une fonction
      gsm.DelPhoneNumber(inSerial[4]);

// Il devrait effacer le numero qui se trouve a la position 3

}


La fonction gsm.DelPhoneNumber(inSerial[4]); doit passer en parametre un byte, dont voici une partie de catte fonction
Code: [Select]

char GSM::DelPhoneNumber(byte position)
{
  char ret_val = -1;

  if (position == 0) return (-3);
  if (CLS_FREE != GetCommLineStatus()) return (ret_val);
  SetCommLineStatus(CLS_ATCMD);
  ret_val = 0; // phone number was not written yet


donc si je fais ca
Code: [Select]

gsm.DelPhoneNumber(3);

ca marche, mais si je fais ca
Code: [Select]

gsm.DelPhoneNumber(inSerial[4]);

ca e marche pas.
Ce qui dans un sens ne me surprend pas car inSerial[4] est un char.

J'ai essayé plusieur possiblité pour converti inSerial[4] en byte, comme par exemple

byte pos = (byte)inSerial[4] // mais ca me retourne 50

N'y a-t-il pas un moyen simple pour que ma fonction returne bien le chiffre qui se trouve en position 4? et en byte (ou oeut etre int)?

Milles mercis
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

skywodd

Bonjour,

Tu veut la valeur numérique du char ('0' = 0 par exemple) ?

Si oui :
Code: [Select]
taFonction((byte)('0' - tonChar));

Idéalement il faudra un test :
Code: [Select]
if(tonChar >= '0' && tonChar <= '9') {
// valeur entre 0 ~ 9 ok
} else {
// pas bon
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

pierrot10

Super merci je vais essayé ca!!!
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

pierrot10

Ben ca ne marche pas

Code: [Select]

gsm.DelPhoneNumber(byte)('0' - inSerial[4]));


ceci
Code: [Select]

Serial.print((byte)('0' - inSerial[4]));

me retiurne 254 alors que ca sevrait etre 2

:smiley-roll-sweat:
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

skywodd

Heu ... essaye ça (je crois que j'ai inversé un truc en fait) :
Code: [Select]
Serial.print((byte) (inSerial[4] - '0'));
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

bricoleau


J'ai essayé plusieur possiblité pour converti inSerial[4] en byte, comme par exemple

byte pos = (byte)inSerial[4] // mais ca me retourne 50


si ton inSerial[4] = '3' la valeur retournée devrait plutôt être 51

Pour ta compréhension :

En char tu manipules des caractères, stockés sur un octet.
Mais un octet, c'est une série de 8 bits, qui peut être interprétée comme une valeur entière comprise entre 0 et 255.
Et donc à chaque caractère on associe un nombre.
Ainsi :
- le caractère 'A' correspond au nombre 65, 'B' au 66, etc. en suivant 'Z' au 90
- idem pour les 26 lettres minuscules 'a' 97, ... 'z' 122
- le caractère espace est le 32
- le caractère '0' est le 48, '1' 49, etc.
On trouve aussi des caractères spéciaux non affichables
Par exemple le 13 correspond au retour charriot (faut imaginer le matos de l'époque où la norme ASCII a été pondue), le 10 au saut de ligne. Tu les connais peut-être sous leur forme '\r' et '\n' que l'on trouve souvent dans du code C (cette manière d'écrire un caractère s'appelle une séquence d'échappement).

Mais finalement, pour ton compilo et ton arduino, un byte ou un char c'est pas loin d'être la même chose : un octet

Quelques exemples :

Code: [Select]

byte i;
char c;

c = '0';
i = (byte) c; // i=48
c = '2';
i = (byte) c; // i=50
i = (byte) (c - '0'); // i= (50 - 48) = 2
i = ((byte) c) - 48; //idem
i = 3;
c = (char) (i + 48); // c = '3'
c = ((char) i) + '0'; //idem





Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

pierrot10

#6
Jul 17, 2013, 07:21 pm Last Edit: Jul 17, 2013, 07:38 pm by pierrot10 Reason: 1
Super, je vous remercie!!!

Je pense que je peux aussi faire une comparaison comme ceci

Code: [Select]

char msg[5];
gps.getBattInf(msg1,msg2);
  if(((byte)(*msg1 -'0')) < 10){
    #ifdef DEBUG
      Serial.print(F("WARNING Low battery : "));
      Serial.println(msg1);
      Serial.print(F("\n"));
    #endif
  }


Je veux tester msg1 si elle est plus petit que 10.

msg1 est un char et retourne une valeur de 0 à 100 qui resprésemtage le pourcentage de la batterie
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

skywodd


msg1 est un char et retourne une valeur de 0 à 100 qui resprésemtage le pourcentage de la batterie

STOP, ya un soucis là !

Un char qui contient une valeur entre 0 et 100 !?
Dans ce cas c'est un char utilisé comme un "bête" int, mais pas un char dans le sens chaine de caractère.
"100" = 3 char.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

pierrot10

Ok mais si msg1 est initié comme ceci:

char msg1[5];

En sachant que cette fonction va permettre à msg1 d'afficher une valeru entre 1 et 100, comme puis comparer pourqu'un message s'affiche si la valeur est inférieur à 30%

Code: [Select]
gps.getBattInf(msg1,msg2);
  // Je defini la limite
  char limite[3] = 30;
  // Je vonvertis msg en byte et je compare
  if(msg1 < limite){
    #ifdef DEBUG
      Serial.print(F("WARNING Low battery : "));
      Serial.println(msg1);
      Serial.print(F("\n"));
    #endif
  }
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

skywodd

Tu ne peut pas faire de comparaison "A < B" sur des tableaux !
Cherche la fonction "atoi" sur google ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up