2012-04-09 7 views
3

S'il vous plaît supporter avec moi, je suis nouveau à C et je suis en train de programmer un Arduino. Je veux écrire un programme qui crache une trame de données de longueur spécifique avec des valeurs d'octets allant de 0 à 255. Le code minimum pour reproduire l'erreur est dans le bloc de code ci-dessous. Lors de la compilation que je reçois l'erreur suivante:erreur: conversion invalide de 'char *' en 'char'

sketch_apr09b.cpp: In function ‘char assembleFrame()’: 
sketch_apr09b.cpp:9:10: error: invalid conversion from ‘char*’ to ‘char’ 

Maintenant, mon impression est que je maltraite le « cadre de retour », mais je ne peux pas comprendre ce qui ne va pas.

char assembleFrame() { 
    char frame[] = { 
    0x61 , 0x62 , 0x63 
    }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    char frame = assembleFrame(); 
    Serial.print(frame); 
} 

Quand je lance un hexdump sur l'ordinateur de réception, je veux voir

00000000 61 62 63           |abc| 
00000003 

J'ai trouvé beaucoup de questions semblables, n'a pas été en mesure de comprendre ce que je suis mal faire.

EDIT: C'est ce que j'ai trouvé jusqu'à présent, mais en recevant des données erronées. Je pense que j'envoie le pointeur aux données réelles avec ceci.

byte *assembleFrame() { 
    byte frame[] = { 4 , 'a' , 'b' , 'c' }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    byte *frame = assembleFrame(); 
    Serial.write(frame , frame[ 0 ]); 
} 

Répondre

3

Le type char est utilisé pour stocker un seul char (un octet).

Votre définition de la fonction char assembleFrame spécifie la fonction ne sera de retour d'un seul char, donc quand vous essayez de retourner un char[]/char * (char tableau/pointeur), il échoue.

On dirait que Serial.print() peut gérer un char *, qui devra éventuellement être terminé par un caractère nul (car il ne nécessite aucun spécificateur de longueur).

char *assembleFrame() { 
    char frame[] = { 
    0x61, 0x62, 0x63, 0x00 // null byte to signify end of string 
    }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    char *frame = assembleFrame(); 
    Serial.print(frame); 
} 
+0

Ce code compile, et je vois ce que je faisais mal, thnx. Je tapais 'char * assembleFrame()' au lieu de 'char * assembleFrame()'. Mais j'ai maintenant un nouveau problème: je ne peux pas utiliser de chaînes à zéro terminal, car la charge utile peut contenir des octets nuls. La taille fixe n'est pas un problème. Est-ce facile à résoudre? (en commentant votre réponse je n'ai pas eu la chance de DuckDuckGo ceci, mais je vais le faire maintenant). – jippie

+0

Vous pouvez envoyer des octets à 'Serial.write()' un à la fois, ce qui devrait autoriser les valeurs nulles. Peut-être que 'assembleFrame' écrit le cadre dans un tampon (pointeur sur une chaîne), et renvoie une longueur - alors vous pouvez parcourir le tampon et' Serial.write() 'chaque' char'. – lunixbochs

+1

oui, je l'ai trouvé il y a juste 1 seconde moi-même :) en fait, vous pouvez passer un paramètre de longueur avec Serial.write (buf, len 0) – jippie

-1

assembleFrame retours char alors que vous revenez char*. Comme je ne sais pas ce que tu fais, je ne peux pas suggérer comment régler ça. Peut-être que fixer le type de retour est la bonne façon.

0

En regardant ce code:

char frame = assembleFrame(); 

Étant donné la façon dont vous l'utilisez plus tard, clairement frame doit être déclarée char * pas char et assembleFrame a besoin d'être déclarés comme retour char *.

Questions connexes