2012-04-09 10 views
3

Bitte tragen Sie mit mir, ich bin neu bei C und ich versuche, ein Arduino zu programmieren. Ich möchte ein Programm schreiben, das einen Datenrahmen bestimmter Länge mit Bytewerten zwischen 0 und 255 ausspuckt. Der Mindestcode zum Reproduzieren des Fehlers befindet sich im folgenden Codeblock. Beim Kompilieren erhalte ich folgende Fehlermeldung:Fehler: ungültige Konvertierung von 'char *' zu 'char'

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

Nun ist mein Eindruck ist, dass ich das ‚Return frame‘ bin schlecht zu behandeln, aber ich kann einfach nicht herausfinden, was los ist.

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

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

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

Wenn ich einen hexdump auf dem empfangenden PC laufen, ich will sehen:

00000000 61 62 63           |abc| 
00000003 

Ich habe viele ähnliche Fragen gefunden, war nicht in der Lage, herauszufinden, was ich bin falsch machen.

BEARBEITEN: Dies ist, was ich bisher kam, aber falsche Daten erhalten. Ich denke, ich sende den Zeiger auf die tatsächlichen Daten mit diesem.

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 ]); 
} 

Antwort

3

Der Typ char wird verwendet, um einen einzelnen char (ein Byte) zu speichern.

Ihre Funktionsdefinition char assembleFrame gibt die Funktion nur ein einziges char zurückkehren, so dass, wenn Sie versuchen, einen char[]/char * (char Array/Zeiger) zurück, es funktioniert nicht.

Sieht aus wie Serial.print() kann eine char * behandeln, die möglicherweise Null-terminiert werden muss (weil es keine Längenangabe erfordert).

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

Dieser Code kompiliert, und ich sehe, was ich falsch gemacht habe, thnx. Ich habe 'char * assembleFrame()' anstelle von 'char * assembleFrame()' eingegeben. Aber ich habe jetzt ein neues Problem: Ich kann keine Null-terminierten Strings verwenden, weil die Payload Nullbytes enthalten kann. Feste Größe ist kein Problem. Ist das einfach zu lösen? (Ihre Antwort kommentierend, ich hatte keine Chance zu DuckDuckGo dies, aber werde es jetzt tun). – jippie

+0

Sie können nacheinander Bytes nach 'Serial.write()' senden, was Nullen zulassen sollte. Vielleicht habe 'assemblyFrame' den Rahmen in einen Puffer schreiben (Zeiger auf einen String) und eine Länge zurückgeben - dann kann man durch den Puffer und 'Serial.write()' jedes 'char' durchlaufen. – lunixbochs

+1

Ja, ich fand es gerade vor 1 Sekunde selbst :) Tatsächlich können Sie einen Längenparameter mit Serial.write übergeben (buf, len 0) – jippie

-1

assembleFrame kehrt char, während Sie char* zurück. Da ich nicht weiß, was du machst, kann ich nicht vorschlagen, wie das zu beheben ist. Vielleicht ist das Korrigieren des Rückgabetyps der richtige Weg.

0

an diesem Code suchen:

char frame = assembleFrame(); 

Bedenkt man, wie Sie es später verwenden, deutlich frame Bedürfnisse werden char * erklärt nicht char und assembleFrame Bedürfnisse als Rückkehr char * deklariert werden.

Verwandte Themen