Moin Moin,
ich arbeite zur Zeit an einem Telnet Server, dieser läuft auch ziemlich
gut, jedoch in er Menü Auswahl nicht wirklich effizient.
Siehe Code:
1
voidparseCommand(){
2
3
if(cmd.equals("quit")){
4
client.stop();
5
connected=false;
6
7
elseif(cmd.equals("1 on"))
8
{
9
digitalWrite(2,HIGH);
10
}
11
12
elseif(cmd.equals("1 off"))
13
{
14
digitalWrite(2,LOW);
15
}
16
elseif(cmd.equals("2 on"))
17
{
18
digitalWrite(3,HIGH);
19
}
20
elseif(cmd.equals("2 off"))
21
{
22
digitalWrite(3,LOW);
23
}
24
elseif(cmd.equals("3 on"))
25
{
26
digitalWrite(4,HIGH);
27
}
28
elseif(cmd.equals("3 off"))
29
{
30
digitalWrite(4,LOW);
31
}
32
elseif(cmd.equals("4 on"))
33
{
34
digitalWrite(5,HIGH);
35
}
36
elseif(cmd.equals("4 off"))
37
{
38
digitalWrite(5,LOW);
39
}
40
41
elseif(cmd.equals("all on"))
42
{
43
digitalWrite(2,HIGH);
44
digitalWrite(3,HIGH);
45
digitalWrite(4,HIGH);
46
digitalWrite(5,HIGH);
47
}
48
elseif(cmd.equals("all off"))
49
{
50
digitalWrite(2,LOW);
51
digitalWrite(3,LOW);
52
digitalWrite(4,LOW);
53
digitalWrite(5,LOW);
54
}
55
56
57
else
58
{
59
server.println("Invalid command, type help");
60
}
61
cmd="";
62
}
ich habe es mit switch case versucht aber da Zeigt mir mein Compiler den
Mittelfinger. Es läuft auf einem Arduino DUE ( ARM Cortex M3)
Ist die Frage jetzt, wie du diesen Code effizienter gestalten kannst
oder ist die Frage warum dieser Code nicht compiliert?
Letzteres läge wohl an der fehlenden } vor dem ersten else if.
Für ersteres würde ich vermutlich den String am Leerzeichen trennen
(split oder so - kenn die Arduino-Libs da nicht).
Wenn vorne zwischen '1' und '5', dann umwandeln in Zahl ('5'-'1'=5 -
alternativ atoi()). Wenn hinten "off" dann LOW merken, sonst HIGH und
dann mit den beiden Werten die digitalWrite() aufrufen.
Ich weiss nicht, ob es Effizienter ist, aber hier hatte ich einen
iterativen ansatz vorgestellt:
Beitrag "Re: Arduino Serial ganze wörter abfragen"
Möglicherweise kann man hier etwas ähnliches machen.
Daniel S. schrieb:> Ist die Frage jetzt, wie du diesen Code effizienter gestalten> kannst> oder ist die Frage warum dieser Code nicht compiliert?> Letzteres läge wohl an der fehlenden } vor dem ersten else if.>> Für ersteres würde ich vermutlich den String am Leerzeichen trennen> (split oder so - kenn die Arduino-Libs da nicht).> Wenn vorne zwischen '1' und '5', dann umwandeln in Zahl ('5'-'1'=5 -> alternativ atoi()). Wenn hinten "off" dann LOW merken, sonst HIGH und> dann mit den beiden Werten die digitalWrite() aufrufen.
ne es funktioniert ja, ich suche nach alternativen, bzw weniger schreib
arbeit bzw weniger if Anweisungen.
Daniel A. schrieb:> Ich weiss nicht, ob es Effizienter ist, aber hier hatte ich einen> iterativen ansatz vorgestellt:> Beitrag "Re: Arduino Serial ganze wörter abfragen">> Möglicherweise kann man hier etwas ähnliches machen.
werde es mir mal angucken :)
Dann kannst du einfach über das Array iterieren und bei einem Treffer
mit Equal die funktion ausführen.
Ich hoffe, ich konnte den Ansatz verständlich machen. Da ist leider
ziemlich umständlich mit den Tablet.
Grüße
Du könntest den String so parsen dass Du einerseits ein Kommando "on"
oder "off" (oder noch andere Kommandos) erkennst und andererseits deren
Argument(e) (in diesem Falle eine Zahl oder "all") (oder kein Argument
bei manchen anderen Kommandos).
Dann musst Du Dir eine sinnvolle simple und konsistente und einfach zu
parsende Grammatik für alle Deine jetzigen und zukünftigen Kommandos
ausdenken (zum Beispiel wäre es evtl leichter zu parsen wenn das
Kommando zuerst und dann erst die (optionalen) Argumente kommen.
Du prüfst dann in einem for-loop, ob der befehlsstring mit einem der
commands beginnt. Ist das der fall, wird der entsprechende handler
aufgerufen.
Dabei ist argp ein pointer auf das erste zeichen nach dem befehl, argLen
die anzahl der noch bleibenden zeichen.
Ardu schrieb:> else if(cmd.equals("1 on"))
Aber in die Doku schreiben, daß nur exakt 1 Leerzeichen zwischen der
Zahl und dem Kommando zulässig ist.
MfG Klaus