Hallo,
mir geht hier etwas auf den Zwickel…
Arduino und serielle Schnittstelle kann ich noch nicht. Es reicht für mehr
als "Serial.begin(9600);" nicht.
Der Mega überträgt mit "Serial.begin" in unbestimmten Abständen Daten über
die serielle Schnittstelle an den MacMini.
Empfangen werden diese Daten von FileMaker- das funktioniert auch alles.
Wenn ich über FileMaker die serielle Schnittstelle öffne, dann führt der Mega
einen Reset durch. Genau wie beim seriellen Monitor der IDE.
Das muss doch nicht sein?
Wie kann ich diesen Reset verhindern?
Wiederstand und Kondensator auf Reset am Mega? Ist das der Weg?
Da muss es doch etwas geben…
Gruß und Dank
Andreas
Hallo,
ich habe mir das serielle Zeug´s einmal angelesen und ein wenig probiert…
Na, ja- geht so. Kommt mir alles ein wenig umständlich vor…
Nun habe ich etwas "einfaches" hoffentlich Richtiges gemacht:
if (Serial.available() > 0)
{
char empfang =Serial.read();
Serial.print(empfang);// nur zur Kontrolle
if (empfang == char(65))
{
lcd.setCursor(2, 2);
lcd.print("Test")
}
Ich möchte dem Arduino etwas senden, und der Arduino soll was machen.
Einfach (sicher) soll es auch sein.
Hier ist es nun so, das ich ein "A" sende- und er macht etwas.
Das funktioniert mit jedem Buchstaben… nun gut.
Ich möchte aber "001" oder "005" aber auch "022" auswerten können.
Also einfach max. eine ganze 3-stellige Zahl.
Ich sende eine "1" mach was
Ich sende eine "12" mach was
Ich sende eine "123" mach was
wie werte ich das denn aus? Doch nicht mit
empfang = char(x) & char(x) & char(x)
Du brauchst einen Trenner, beispielsweise CR oder LF. Also Zeichen sammeln, bis der Trenner kommt, dann auswerten. Oder Du nimmst was anderes als read.
Nicht falsch aber mögliche Optimierungen:
Zwei Optionen, beide mal mit einem LF abgeschlossen
C String einlesen und dann Konvertieren:
const int SERIAL_BUFFER_SIZE = 5;
char serialBuffer[SERIAL_BUFFER_SIZE];
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (readSerial(Serial) == true)
{
int value = atoi(serialBuffer);
if (value == 1)
{
Serial.println("Aktion 1");
}
else if (value == 22)
{
Serial.println("Aktion 22");
}
else if (value == 333)
{
Serial.println("Aktion 333");
}
}
}
bool readSerial(Stream& stream)
{
static byte index;
while (stream.available())
{
char c = stream.read();
if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
{
serialBuffer[index++] = c;
}
else if (c == '\n' && index > 0)
{
serialBuffer[index] = '\0';
index = 0;
return true;
}
}
return false;
}
Ziffern wie sie reinkommen aufaddieren:
void setup()
{
Serial.begin(9600);
}
void loop()
{
int value = readSerial(Serial);
if (value > 0)
{
if (value == 1)
{
Serial.println("Aktion 1");
}
else if (value == 22)
{
Serial.println("Aktion 22");
}
else if (value == 333)
{
Serial.println("Aktion 333");
}
}
}
int readSerial(Stream& stream)
{
static int value;
while (stream.available())
{
char c = stream.read();
if (c == '\n')
{
int tmp = value;
value = 0;
return tmp;
}
else if (c >= '0' && c <= '9')
{
value *= 10;
value += (c - '0');
}
}
return -1;
}
Beachte hier dass nicht-Ziffern einfach ignoriert werden. Also “2a2” ist “22”. Man könnte natürlich die Abfrage auf “zwischen 0 und 9” weglassen und einfach alle Zeichen in value abspeichern. Dann kommt Unsinn heraus wenn man keine Ziffern eingibt, aber dadurch schlägt dann der Vergleich fehl. Anderseits ist “c” dann wahrscheinlich das Gleiche wie “99”…
Das zweite ist hier einfacher, aber merke dir mal die andere Variante. Das ist in anderen Fällen praktischer. Oder wenn du Text senden willst. Oder Text + Zahlen
Hallo,
"(empfang == 'A')"
das hat es ja schon vereinfacht…
Serenifly,
was für einen Spruch muß ich denn aufsagen, damit etwas zurück kommt.
Eingabe
1, Senden, keine Rückgabe im seriellen Monitor, bei beiden Sketchen.
klemme ich "Serial.println(value);" dazwischen dann gibt es eine
4 bis 5-stellige Ganzzahl zurück.
Gruß und Dank
Andreas
Du musst ein Linefeed/Newline als Abschluss senden!
Aber wenn du es bei einzelnen Buchstaben belässt brauchst du sowas nicht. Da reicht ein read(). Aber ganze Strings einlesen braucht man immer wieder mal.
Hallo Serenifly,
hier einmal zwei Bilder für den Lohn Deiner Arbeit.
In Bild-A kann ich manuell eine Sensor-ID eingeben und der Arduino sendet
seine Daten direkt an FM.
In Bild-B sende ich eine Sensor-ID über FM-Script an den Arduino und der
liefert die Daten für die grafische Auswertung.
Dank Deiner Hilfe ist es auch möglich, das der Arduino FM anstößt und FM
sendet Daten an den Arduino- der dann wieder auf FM antwortet.
Also, schönen Dank dafür- und noch schönere Weihnachten.
Gruß und Spaß
Andreas