Serial.Flush()

Ik ben nieuw; hier en met Arduino Uno.
Ik volg daarom de al wat oudere podcasts van jeramy.
Bij podcast 6 komt een simpel serial voorbeeld aan de orde, waarvan de code is:

int ledPin = 13;
void setup()
{
//Create Serial Object
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}

void loop()
{
//Have the arduino wait to receive input
while (Serial.available() == 0);

//Read the Input
int val = Serial.read() - '0';

if (val == 1)
{
Serial.println("Led is On");
digitalWrite(ledPin, HIGH);
}
else if (val == 0)
{
Serial.println("Led is Off");
digitalWrite(ledPin, LOW);
}
else
{
Serial.println("Invalid!");
}
Serial.flush();
}

Heel simpel en logisch allemaal, alleen de serial flush werk niet, in die zin als in voer '10gek' krijg ik als uitvoer
led is on
led is of
invalid
invalid
invalid
terwijl ik had verwacht dat na lezing en uitvoer van het eerste karakter de buffer zou worden geleegd, en dus alleen de eerste regel zou worden uitgevoerd.
Op de podcast van Jeramy gaat het - met dezelfde code - wel goed. Ik weet alleen dat Flush() is gewijzigd. Ik gebruik UNO en Arduino 1.0.1.

Hans of is het Piet?
Welkom op het Nederlandstalige arduino forum.
En ja, ...... nieuw en al direct naar een van de grotere pijnpunten van Arduino.
Arduino heeft de functionaliteit van Serial.flush(); veranderd in 1.0. Niet iedereen was daar even tevreden mee.
Als je dus met Arduino 0023 aan de slag zou gaan zal die code werken zoals je verwacht.
Vanaf 1.0 smijt de flush de gegevens niet meer weg. Vandaar dat je

led is on
led is of
invalid
invalid
invalid

krijgt en niet de verwachte

led is on

krijgt.
In de flush documentatie staat

Waits for the transmission of outgoing serial data to complete. (Prior to Arduino 1.0, this instead removed any buffered incoming serial data.)

Ik hoop dat je hiermee bent geholpen.
Met vriendelijke groet
Jantje

Het is Hans Pieters, dus neem maar wat,

Jouw antwoord is overeenkomstig wat ik elders lees. Maar dan houdt het op.
Wat is de oplossing ? Flush is naar mijn mening een absoluut noodzakelijke functie. Er moet wel een vervangende functie zijn, alleen al om de invoer te kunnen stoppen als een stopcode is waargenomen.
Bedankt.

hans Pieters
Wat dacht je van

while (Serial.available()) Serial.read();

Merk op dat je de seriële invoer niet zomaar kan stoppen. Vergelijk het met je in-bakje op het werk. Jij kan het legen, maar .... anderen (collega's noemen ze dat dan :wink: ) vullen het. En die anderen kan je niet (zomaar) stoppen.
Hetzelfde geldt voor seriële communicatie.

Met vriendelijke groet
Jantje

Bedankt. Ik zie nu in, dat ik het via de software moet oplossen. Het vervelende is alleen dat je als software maker geen eisen kan stellen aan de invoer zoals dat bij andere talen gaat. Net als op het werk, collega's gooien maar in het bakje IN, het enige wat je dan kan doen is in de stress schieten.
Ik ga nu maar weer verder met een ander projectje.
Kun je overigens een boek aanraden. De boekjes van Massimo Banzi en van Simon Monk heb ik gelezen. Ze waren leuk, maar theoretisch en praktisch toch wel iets te eenvoudig

Hans
Ikzelf ben geen boekenlezer en ervaren programmeur dus ik moet enkel elektronica leren (wat al moeilijk genoeg is)
Het is ook zo dat alles op zich heel eenvoudig is met Arduino en dat het pas moeilijk wordt als je gaat combineren.
Dit betekend dat een uitleg of heel basic is of heel specifiek (iets wat je misschien nooit zal tegenkomen)
Het beste is nog steeds ervaring met anderen delen. Daarvoor is een Jam een ideaal moment.
Er is dit weekend (21 tot 23 september 2012) een Jam in het timelab in gent. http://www.arduino-jam.org/

Met vriendelijke groet
Jantje