PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arrays definieren



aircode
01.11.2008, 14:43
Hallo hier im Forum!

Bin neu hier und versuche meine ersten Schritte in Sachen programmieren!

Seit ca. 2 Stunde versuche ich unten stehndes Programm in Gang zu bringen! Ergebnis negativ :-) Könnt ihr mir sagen wo der Fehler liegt? Ich denke mal, es liegt an dem Array... aber was?

PS: Es soll mit dem Programm eine Logitech Harmony 525 angelernt werden!

Danke!



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();

setLEDs(0b111111);

writeString_P("\n\n Welcher RC5 Code soll gesendet werden?:\n");

while(true)
{

char antwort[1];

receiveBytes(2);
waitUntilReceptionComplete();
copyReceivedBytesToBuffer(&antwort[0]);

if(antwort[0] == '32') // Mit Eingabe 32 wird der RC5 Code 32 gesendet
{
writeString_P("RC5 Code: 32 - Befehl 'VORWÄRTS' wird gesendet\n");
IRCOMM_sendRC5(17,32); // sendet
}

if(antwort[0] == '33') // Mit Eingabe 33 wird der RC5 Code 33 gesendet
{
writeString_P("RC5 Code: 33 - Befehl 'RÜCKWÄRTS' wird gesendet\n");
IRCOMM_sendRC5(17,33);
}

if(antwort[0] == '11') // Mit Eingabe 11 wird der RC5 Code 11 gesendet
{
writeString_P("RC5 Code: 11 - Befehl 'STOP' wird gesendet\n");
IRCOMM_sendRC5(17,11);
}

task_ACS();

mSleep(50);
}

return 0;

}

uwegw
01.11.2008, 15:03
Achte mal auf die Warnung, die da kommen! '32' ist keine zulässige Schreibweise in C. Die Hochkommata sind für Einzelbuchstaben als ASCII-Code vorgesehen. '3' liefert also den ASCII-Code für die Zahl 3. Aber nur, wenn da ein einziges Zeichen steht. Aus deinem '32' macht der Compiler irgendwas (*), nur keine 32 als Zahlenwert.

Wahrscheinlich wäre
if(antwort[0] == 32)
richtig.

(*) Hab's gerade mal getestet: Er schein nur das letzte Zeichen zu übernehmen, aus '32' wird die Zahl 2.

sternst
01.11.2008, 15:04
char antwort[1];

receiveBytes(2);
Anscheinend willst du 2 Bytes empfangen. Das Array hat aber nur die Länge 1.
-> char antwort[2];


if(antwort[0] == '32') // Mit Eingabe 10 wird der RC5 Code 32 gesende
Irgendwie passt der Kommentar nicht zum Code. Was soll denn hier im Array stehen? Vielleicht die Zeichenfolge "10"?
-> if (antwort[0] == '1' && antwort[1] == '0')

radbruch
01.11.2008, 15:27
Hallo

So ganz verstehe ich den Sinn des Programms auch nicht. Meine Vermutung: Du willst mit dem RP6 deiner Fernbedienung RC5-Codes beibringen. Der RP6 wird dabei über das Terminal im Loader gesteuert:

#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
powerON();
setLEDs(0b111111);
writeString_P("\n\n Welcher RC5 Code soll gesendet werden?:\n");

while(true)
{

if(readChar() == 'w') // Mit Eingabe w wird der RC5 Code 32 gesendet
{
setLEDs(1);
writeString_P("RC5 Code: 32 - Befehl 'VORWÄRTS' wird gesendet\n");
IRCOMM_sendRC5(17,32); // sendet
mSleep(200);
setLEDs(0b111111);
}

if(readChar() == 'x') // Mit Eingabe x wird der RC5 Code 33 gesendet
{
setLEDs(2);
writeString_P("RC5 Code: 33 - Befehl 'RÜCKWÄRTS' wird gesendet\n");
IRCOMM_sendRC5(17,33);
mSleep(200);
setLEDs(0b111111);
}

if(readChar() == 's') // Mit Eingabe s wird der RC5 Code 11 gesendet
{
setLEDs(4);
writeString_P("RC5 Code: 11 - Befehl 'STOP' wird gesendet\n");
IRCOMM_sendRC5(17,11);
mSleep(200);
setLEDs(0b111111);
}
task_ACS();
mSleep(50);
}
return 0;
}

Nach w, s oder x (und ENTER!) schickt der RP6 das entsprechende Signal. (Ab dem zweiten Mal muss man die Zeichen mit dem Terminal mehrfach senden (?) und ich weiß nicht, ob deine Harmony das Ergebniss frißt.)

Gruß

mic

aircode
01.11.2008, 15:34
Sorry - der Kommentar war falsch - ist jetzt richtig gestellt.

Hab das Programm jetzt folgend abgeändert!

Wusste nicht, dass " ' " nur für einstellige Werte verwendet werden darf! Zwar kommt jetzt keine Fehlermeldung, trotzdem geht's nicht - Leider...




#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();

setLEDs(0b111111);

writeString_P("\n\n Welcher RC5 Code soll gesendet werden?:\n");

while(true)
{

char antwort[2];

receiveBytes(2);
waitUntilReceptionComplete();
copyReceivedBytesToBuffer(&antwort[0]);

if(antwort[0] == 32) // Mit Eingabe 32 wird der RC5 Code 32 gesendet
{
writeString_P("RC5 Code: 32 - Befehl 'VORWÄRTS' wird gesendet\n");
IRCOMM_sendRC5(17,32); // sendet
}

if(antwort[0] == 33) // Mit Eingabe 33 wird der RC5 Code 33 gesendet
{
writeString_P("RC5 Code: 33 - Befehl 'RÜCKWÄRTS' wird gesendet\n");
IRCOMM_sendRC5(17,33);
}

if(antwort[0] == 11) // Mit Eingabe 11 wird der RC5 Code 11 gesendet
{
writeString_P("RC5 Code: 11 - Befehl 'STOP' wird gesendet\n");
IRCOMM_sendRC5(17,11);
}

task_ACS();

mSleep(50);
}

return 0;

}

aircode
01.11.2008, 15:41
Nach w, s oder x (und ENTER!) schickt der RP6 das entsprechende Signal. (Ab dem zweiten Mal muss man die Zeichen mit dem Terminal mehrfach senden (?) und ich weiß nicht, ob deine Harmony das Ergebniss frißt.)


Funktionieren tut das ganze eigentlich schon da ich gestern schon erfolgreich war. Die Harmony spielt da voll und ganz mit...

Allerding hab ich gestern für die Programmierung der FF nur 8 x RC5 Codes benötigt. Das Array war somit nur ein Bit lang.

Heute wollte ich jedoch mehr als 9 Codes senden - und da fing das Problem an, da das Arráy jetzt 2 stellig ist und ich auch 2 stellige Daten vom "Terminal" empfangen will!

Ich hab in dem Beispiel Programm allerdings nur 3 Bedingungen eingefügt, damit das ganze übersichtlich bleibt!

Oder ist es evtl. gar nicht möglich, dass man in einer "if" bedingung nicht mehr als einstellige Werte abfragen kann?

Danke...

sternst
01.11.2008, 15:47
if(antwort[0] == 32)
->
if (antwort[0] == '3' && antwort[1] == '2')

aircode
01.11.2008, 16:58
if(antwort[0] == 32)
->
if (antwort[0] == '3' && antwort[1] == '2')

Danke - so geht das also :-)

Letzte Frage noch zu dem Programm: Wie lange wird der RC5 Code gesendet bzw. gehe ich mal davon aus, dass er so lange sedet, bis ein neuer Code gsendet wird...

Gibt es eine STOPP Funktion für das senden von IR Signalen?

Danke...

radbruch
01.11.2008, 17:58
Aus der Beschreibung von IRCOMM_sendRC5():

* This function initiates a RC5 transmission with the IRCOMM.
* You need to call the "task_ACS()" function (s. below) frequently
* out of the main loop - otherwise it will not work! (this is required
* because it needs to be synchronized with the ACS...)
* The transmission itself is interrupt based and takes about 20ms.

Es wird einmalig der Code gesendet.

aircode
01.11.2008, 20:50
Danke für die tolle Hilfe!!