Comment convertir un char en byte

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

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

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

gsm.DelPhoneNumber(3);

ca marche, mais si je fais ca

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

Bonjour,

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

Si oui :

taFonction((byte)('0' - tonChar));

Idéalement il faudra un test :

if(tonChar >= '0' && tonChar <= '9') {
 // valeur entre 0 ~ 9 ok
} else {
 // pas bon
}

Super merci je vais essayé ca!!!

Ben ca ne marche pas

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

ceci

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

me retiurne 254 alors que ca sevrait etre 2

:cold_sweat:

Heu ... essaye ça (je crois que j'ai inversé un truc en fait) :

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

pierrot10: 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 :

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

Super, je vous remercie!!!

Je pense que je peux aussi faire une comparaison comme ceci

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

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

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%

 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
  }

Tu ne peut pas faire de comparaison “A < B” sur des tableaux !
Cherche la fonction “atoi” sur google :wink: