C++ Arduino variable

Résolu
cricri1999 Messages postés 3 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 16 février 2016 - 15 févr. 2016 à 11:23
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 16 févr. 2016 à 10:22
Bonjour,

Voilà je suis un vrai débutant en C++, j'arrive à faire ce que je veux mais là je bloque sur un problème de variable. J'ai le messahe d'erreur suivant :
exit status 1
invalid conversion from 'char' to 'const char*' [-fpermissive]

la chaine est du binaire style 101010010010100 et si je remplace

strcpy(src, ssss); par strcpy(src, "101010010010100" );

cela fonctionne.

et voici mon code :


#include <IRremote.h>

int broche_reception = 11; // broche 11 utilisée
IRrecv reception_ir(broche_reception); // crée une instance
decode_results decode_ir; // stockage données reçues
char src[40];
char ssss;

void setup()
{
Serial.begin(9600);
reception_ir.enableIRIn(); // démarre la réception
}

void loop()
{

if (reception_ir.decode(&decode_ir))
{

Serial.println(decode_ir.value, BIN);

ssss = decode_ir.value, BIN;

strcpy(src, ssss);

Serial.print(src[0]);
Serial.print(src[1]);
Serial.print(src[2]);
Serial.print(src[3]);
Serial.print(src[4]);
Serial.print(src[5]);
Serial.print(src[6]);
Serial.print(src[7]);
Serial.print(src[8]);
Serial.print(src[9]);
Serial.print(src[10]);
Serial.print(src[11]);
Serial.print(src[12]);
Serial.print(src[13]);
Serial.print(src[14]);
Serial.print(src[15]);
Serial.println(src[16]);


Serial.println("---------------");

reception_ir.resume(); // reçoit le prochain code
}
}


Avez-vous une possibilité ?

MErci de votre aide.

Christophe
A voir également:

5 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 15/02/2016 à 12:03
Bonjour.

char ssss représente un seul caractère.
strcpy prend en argument deux chaînes de plusieurs caractères.
Donc ssss ne peut pas "rentrer" dans un strcpy.

Le compilateur te dit (pourtant clairement) qu'on ne fait pas rentrer plusieurs caractères dans un seul.

Si "decode_ir.value" est un nombre, alors je ne vois pas l'intérêt de passer par une chaîne de caractères. Un simple masque permet de récupérer chacun des élements.
Ex:
int a = 123; // En binaire: 0111 1011

// a & 1        => 01111011 & 00000001 => 1
// a & 10       => 01111011 & 00000010 => 1
// a & 100      => 01111011 & 00000100 => 0
// a & 1000     => 01111011 & 00001000 => 1
// a & 10000    => 01111011 & 00010000 => 1
// a & 100000   => 01111011 & 00100000 => 1
// a & 1000000  => 01111011 & 01000000 => 1
// a & 10000000 => 01111011 & 10000000 => 0

// 1 << 0 => 1
// 1 << 1 => 10
// 1 << 2 => 100
// etc...

// Pour afficher le nombre binaire en partant de la fin, on ferait:
for (int i = 15; i > 0; --i)
  std::cout << a & (1 << i) << std::endl;



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
cricri1999 Messages postés 3 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 16 février 2016
15 févr. 2016 à 12:38
Bonjour,

un grand merci pour votre réponse et votre aide.

là je crois que ça dépasse ma connaissance de débutant. Je ne crois pas faire rentrer plusieurs dans 1 seul vu que src est un tableau ?!

Moi j'aurais besoin de chaque chiffre binaire dans un tableau, par exemple pour 1010101 :

Serial.print(src[0]); = 1
Serial.print(src[1]); = 0
Serial.print(src[2]); = 1
Serial.print(src[3]);= 0
Serial.print(src[4]);= 1
Serial.print(src[5]);= 0
Serial.print(src[6]);= 1

Vous voyez cela comme ça ?



/*
Reception infrarouge
  • /#include <IRremote.h>int broche_reception = 11; // broche 11 utilisée IRrecv reception_ir(broche_reception); // crée une instance decode_results decode_ir; // stockage données reçuesvoid setup() { Serial.begin(9600); reception_ir.enableIRIn(); // démarre la réception }void loop() { if (reception_ir.decode(&decode_ir)) { Serial.println(decode_ir.value, BIN); int a = decode_ir.value, BIN; // En binaire: 0111 1011 for (int i = 15; i > 0; --i){ std::cout << a & (1 << i) << std::endl; } Serial.println("---------------"); reception_ir.resume(); // reçoit le prochain code } }
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 16/02/2016 à 10:06
Je ne crois pas faire rentrer plusieurs dans 1 seul vu que src est un tableau ?!

Si si. Ex:
char c;=> 1 caractère
char tab[40] =>  40 caractères

c = tab; // Invalide. On essaie de mettre plusieurs caractères dans un seul.

// De même
strcpy(tab, c); // Invalide, car strcpy veut: strcpy(plusieurs, plusieurs) et on lui donne: strcpy(plusieurs, un seul).


Mais encore une fois, inutile de passer par une chaîne de caractères, et pas besoin de tableau non plus. Il suffit juste de donner à print, chacun des caractères à la suite dans l'ordre.

Donc à la place des "std::cout" qui ne sont là que pour l'exemple, on peut faire:
for (int i = 0; i < 16; ++i)
{
  Serial.print(decode_ir.value & (1 << i));
}
Serial.println("---------------");


D'après la documentation (je ne m'y connais pas du tout en Arduino), il serait même possible de faire:
Serial.println(decode_ir.value, HEX);

Attention, je dis cela sans avoir vérifié.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
cricri1999 Messages postés 3 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 16 février 2016
16 févr. 2016 à 09:43
Bonjour,

pas facile à comprendre :-) Merci de votre aide.

dans ma fonction httRequest, j'ai un char, comment je dois formuler pour envoyer correctement :

httpRequest(decode_ir.value, BIN);

J'ai l'impression que cette suite de 10101001001 n'est pas pris comme une chaine mais chaque bite séparer !?

Je dois convertir (decode_ir.value, BIN) ?



void httpRequest (char txt) {

retourServeur[0] = "" ;
retourServeur[1] = "" ;
retourServeur[2] = "" ;

IPAddress server(192,168,1,122);

Serial.println("\nConnection au serveur...");
// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
Serial.println("connecte au serveur");
// Make a HTTP request:
client.println("GET /BIN.php?code=" + txt + " HTTP/1.1");
client.println("Host: 192.168.1.122");
client.println("Connection: close");
client.println();
}
}

void loop(void) {



if (reception_ir.decode(&decode_ir)) {

Serial.println(decode_ir.value, BIN);

Serial.println("---------------");

httpRequest(decode_ir.value, BIN);

reception_ir.resume();

}


}

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
16 févr. 2016 à 10:22
Je ne m'y connais pas du tout en Arduino, donc pour les questions trop spécifiques, je t'invite à regarder la documentation.

Au niveau du C, tu sembles encore confondre caractère et texte (chaînes de caractères).
char => 1 seul et unique caractère.
char* ou char[] => Chaîne de plusieurs caractères.
Donc quand tu marques "char text", à moins que ton texte ne fasse qu'un seul caractère, tu te doutes bien qu'il y a déjà un souci....

En C, on ne peut pas faire "+" entre deux char* (ça additionnera les adresses, mais ça ne concatenera pas). En C++, une chaine de caractères s'écrirait plutôt "std::string" et là, le "+" fait bien ce que tu attends. Si tu utilises du C++, préfère donc "std::string" à "char*", ça te simplifiera la vie (un std::string se converti en char* en utilisant sa méthode ".c_str()", ce qui te permet de le faire "rentrer" dans les fonctions qui te demande du char*).
0
Rejoignez-nous