Forum: Mikrocontroller und Digitale Elektronik Arduino Serial (4 oder mehr Zeichen)


von Fridolin (Gast)


Lesenswert?

Hallo,
ich bin ein Elektro/MC Neuling. Derzeit versuche ich eine kleine 
Steuerung umzusetzen. Soweit funktioniert das ganze auch sehr gut, ich 
arbeite hierbei vom Rechner über die Console. Ich hätte die Ports aber 
gerne sinvoller "beschriftet", daher habe ich mir hierfür folgendes 
Muster ausgesucht "0011" soll Ausgang 1 anschalten (001=port 
1=true/false) "0010" schaltet Ausgang 1 aus.
Wenn ich diesen "Code" (0011) allerdings über die Console sende, wird 
dieser scheinbar nicht zusammenhängend verarbeitet sondern jedes Zeichen 
für sich.
Hat jemand für mich einen Lösungsvorschlag, bzw. kann mir helfen ?
Danke ! :)

##################################
int ausgang1 = 2;
void setup()
{
pinMode(2, OUTPUT);
Serial.begin(9600);
}
void loop()
{
while (Serial.available() == 0);
int value = Serial.read() - '0';
Serial.println("Erfolgreich einen Befehl erhalten!\n");
if (value == 0011)
{
digitalWrite(ausgang1,HIGH);
delay(10);
}
else if (value == 0010)
{
digitalWrite(ausgang1,HIGH);
delay(10);
}
else
{
Serial.println("Leider war die Eingabe fehlerhaft!\n\n");
}
Serial.flush();
}
##################################

von Bastian W. (jackfrost)


Lesenswert?

Hi,

du musst halt warten bis du die vier Zeichen im Puffer hast.
1
If (Serial.available() >= 4)
2
{
3
  ....
4
5
}

Und dann musst du nur noch die Daten zu deiner Zahl zusammensetzten
1
value = 0;
2
for(uint8_t i=0; i>3; i++)
3
{
4
   value = value * 10 + ( serial.read() - '0';
5
6
}

Gruß JackFrost

von Au weia (Gast)


Lesenswert?

Bastian W. schrieb:
> Und dann musst du nur noch die Daten zu deiner Zahl zusammensetzten

Und dann darfst Du den Vergleich nicht mehr so machen:

Fridolin schrieb:
> if (value == 0010)

von Bastian W. (jackfrost)


Lesenswert?

Wobei ein prüfen mit Dezimal oder Oktal Werten unnötig viel Code macht.

Mit ner Bitmaske geht das einfacher.

Vorallem bei 4 Bit hast du 16 Zustände und so mit 16 If Abfragen mit ner 
Bitmaske nur 8.

Bei 8 Bit müsstest du 256 If Abfragen schreiben mit der Maske nur 16

Dafür musst du nur das Zusammensetzen über links schieben der Bits 
machen

Gruß JackFrost

von Carl D. (jcw2)


Lesenswert?

Vorsicht: in C (C++/"Arduino Sketch") werden Ziffern-Konstaneten, die 
mit "0" beginnen, als Oktal-Zahl aufgefaßt.
Also ist 0011 = 1*8 + 1 = 9
Andere Darstellungen:
binär       0b1001     (Eigentlich GCC-Erweiterung, aber inzwischen
                        Standard
dezimal     9
Hexadezimal 0x09
Oktal       011

oder aber als
char        '\t'.       TAB (ASCII und ff. vorausgesetzt)

Und ganz wichtig: Zfferfolgen sind numerische Literale und nicht das 
gleiche wie Strings.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.