Hallo Heute ist mein Arduino endlich gekommen "juhu".
Ich wollte ein kleines Programm in C# schreiben, mit dem ich die LED ein und ausschalten kann, und die delay zeiten regeln kann.
Ein/Aus funktioniert wunderbar. Ich schicke mit serialPort1.write(signal) eine 1 oder eine 0 um die LED anzusteuern.
So jetzt zum Problem. Ich möchte jetzt noch zusätzlich eine zweite variable an den mc schicken, in der ich die delay zeiten für den LED status übermittle.
val = Serial.read();
if (val > '0' && val <= '9' ) {
val = val - '0';
for(int i=0; i<val; i++) {
Serial.println("blink!");
digitalWrite(ledPin,HIGH);
delay(zeit); wie kriege ich die zahl aus dem string (val) in die variable zeit?
digitalWrite(ledPin, LOW);
delay(zeit);
}
//Serial.println();
}
}
hmmm..., ich stelle fest, mit der arduino-proggerei wird wild gegen die winavr-c-regeln verstossen.
es gbt noch andere brandnester in den fertigen routinen, die ein flächenbrand hinsichtlich des speicherverbrauches verursachen.
Kannst Du das bitte genauer erklären. Ich habe keine Begründung gefunden.
Hat keiner eine Idee
Doch. Du musst dann halt z.B. folgende Zeichenkette schicken $$1,2000** Danach die ankommenden Bytes nach einem $$ durchsuchen, alles in einen String schreiben, bis ** kommt. Nun den String zerlegen. Das erste Zeichen steht für ein oder aus, ab dem dritten Zeichen kommt dann die restliche Variable.
Das ist natürlich quick and dirty und geht noch viel schöner. Eine Einfache Sache wäre noch das delay auf 0-9 oder ein vielfaches zu beschränken. Dann könntest Du folgende Zeichen senden. S1 oder S0 für ein oder aus. D1 oder D5 für 0,1 Sekunde oder 0,5 Sekunden. Dann brauchst Du nur nach den Zeichen S oder D suchen und das nächste Zeichen enthält dann deine gewünschte Info.
hmmm..., da ist doch ein schönes beispiel drin , wie man einen festen wert in der delay hat, wie es gefordert wird und dann eben eine variable in der for-schleife , die sehr klein im binär-code gehalten wird :
ein ausszug für unsere pusteblume zitat :
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden....
Sorry aber ich habe schon das ganze Internet durchforstet und finde kein passendes Beispiel. Aus deinen Links werde ich leider nicht schlauer und glaube dass die nicht mit dieser Problematik zu tun haben
Ich weiß wie ich das Problem lösen könnte, nur bräuchte ich ein Beispiel wie ich einen String zerlegen könnte.
Wie kann ich den folgenden String in ein Array zerlegen:
signal = "123456789"
Ich weiß wie es in C und anderen Sprachen geht, ich will es aber in meinem arduino scatch machen. da will ich den string den ich seriell empfangen habe zerlegen
void get_data() {
char data[80];
int incount = 0;
if ( Serial.available() )
{
while (Serial.available()) {
data[incount++] = Serial.read();
}
//data[incount] = '\0'; // puts an end on the string
Serial.println(data);
}
}
So, das Problem sieht so aus:
Ich schicke seriell: 12345678
Als Antwort bekomme ich:
1
2
3
45
warum?
wenn ich jetzt noch mal was sende z.B. 9999
bekomme ich
678 zurück.
Serial.print.data[0] liefert auch keine ergebnisse, warum ?
irgendwie verstehst du das mit dem seriellen ablauf nicht.
wenn ich sichere daten empfangen möchte in "c" dann muss auch eine abstimmung stattfinden zwischen versender und verschicker sonst hast du nur den gurkensalt wie jetzt auch.
was meinst du wohl warum eine serielle schnittstelle 9 pins hat?....he...
jetzt lese dir das mal ganz durch mit dem uart..., da steht auch etwas vom empfang von zeichenketten...:
Hallo mazell
Du scheinst den Eingangsbuffer schneller zu leeren als Daten kommen.
Versuch mal:
eine schneller Baudrate einzustellen
oder ein delay (5) in die while Schleife zu geben.
Das "Serial.println(data);" muß nach dem "data[incount++] = Serial.read(); " stehen da Du ansonsten einige Zeichen nicht ausdrucken könntest.
Des weiteren sehe ich daß der Empfang nicht im Loop steht sondern in einer anderen Funktion. Slbald der Eingangsbuffer leer ist springst Du aus dieser Funktion und mußt sie für den Empfang der weiteren date wieder aufrufen.
Grüße Uwe
uwefed:
Hallo mazell
Du scheinst den Eingangsbuffer schneller zu leeren als Daten kommen.
Versuch mal:
eine schneller Baudrate einzustellen
oder ein delay (5) in die while Schleife zu geben.
Das "Serial.println(data);" muß nach dem "data[incount++] = Serial.read(); " stehen da Du ansonsten einige Zeichen nicht ausdrucken könntest.
Des weiteren sehe ich daß der Empfang nicht im Loop steht sondern in einer anderen Funktion. Slbald der Eingangsbuffer leer ist springst Du aus dieser Funktion und mußt sie für den Empfang der weiteren date wieder aufrufen.
Grüße Uwe
Danke Uwe, jetzt funktioniert es Mir stellt sich nur die Frage, warum ich hinterher nicht mehr auf das array zugreifen kann (Außerhalb der while schleife) =? Die Ausgabe stimmt jetzt.
Wenn ich jetzt folgenden Code ausführe, passiert nichts:
ihr lasst die wesentlichen grundzüge der uart-programmiererung ausser acht.
sender und empfänger müssen sich immer verständigen wann daten losgeschickt werden und ankommen.
eine delay in der schleife ist unsinn, bremst nur den gesamten ablauf ab und nicht nur die uart-spielerei.
die zeit zum lesen der richtigen uart-handhabung sollte man schon haben, bevor man gross in die tasten haut und dem zufall der delay-bremse überlässt.
mit dem hammer kann man das ziel schlecht erreichen.