Mega 2560 und die Serielle…

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

Doch, das ist der Weg!
Ein Kondensator reicht.

Alternativ:
Manche Arduinos haben eine Lötbrücke, welche man durch kratzen kann.
Dein Mega vermutlich auch...

Begründung:
Die Serielle zuckt mit dem DTR Pin beim öffnen.

SkobyMobil:
Wie kann ich diesen Reset verhindern?

http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

Hallo,
ihr seid doch die Besten…
aber schlagt schon einmal die Hände über den Kopf zusammen- ich komme "seriell" wieder.

jurs, die Seite gibt es aber noch nicht soo lange…
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)

Gruß und Dank
Andreas

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:

if (Serial.available())
if (empfang == 'A')

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,

Läuft! Ist überhaupt kein Problem... wenn man es dann mal gefressen hat.

Da kann ich richtig etwas mit anfangen und es bringt mich ein ganzes Stück weiter.
Vielen Dank für Deine Hilfe.
Gruß und Spaß
Andeas

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