Daten aus dem Serial auslesen und splitten

also jetzt ging es --> d.h. ist es also falsch? haha ich hab die Einlesefunktion nicht geändert hatte nur

    else if(start && c == '+' && index > 0)
    {
      SerialBuffer[index] = '\0';
      index = 0;
      start = false;
      return true;
    }

nur vergessen gehabt start=false zu setzen. Was ist da falsch daran?

Sorry bin etwas verwirrt :frowning:

^test.png

Ich frage mich halt wieso nicht einfach den Code so kopiert hast wie er ist. Sondern anscheinend abgetippt und dabei Funktionsnamen falsch geschrieben und Zeilen vergessen :slight_smile:

Durch das fehlende start = false hat er dann den Anfang nicht korrekt erkannt und alle Zeichen eingelesen. Also auch das nächste 'A'. Deshalb ging es beim ersten String (wo start noch false ist) und danach nicht mehr.

Ich will nicht einfach etwas kopieren, ich möchte daraus lernen deshalb. Aber das stimmt, hätte ich es kopiert, wäre mir der Fehler nicht passiert. Aber das stimmt also, ist doch kein Fehler mit dem A?

Ich integriere es in dem Code und teste es mal aus .

Der Fehler war weil du start nicht auf false gesetzt hast. Das hast du ja selbst gefunden. Und auf 'A' wird nur in dem Fall abgefragt. Schau dir mal deinen Screenshot an. Die erste Eingabe hat funktioniert. Danach nicht mehr. In #20 ging es dann.

Man könnte auf das Startzeichen auch verzichten. Nur ein Endzeichen reicht meistens aus.

So habe es jetzt getestet , an den XBEE welcher an dem Arduino FIO angeschlossen ist, doch leider kommen die Daten nicht an dem anderen Arduino an. Hab auch versucht das delay zu erhöhen doch keine chance :frowning:

Hast du dir die Sache mit den seriellen Anschlüssen inzwischen mal angesehen? Wie ist das jetzt genau verkabelt?

Du kannst nicht auf einem UNO auf 0/1 ein externes Gerät anschließen und gleichzeitig Daten über USB zum PC schicken. Das ist die gleiche Schnittstelle!

Hi ich verwende keinen Uno sondern einen Arduino Fio https://www.arduino.cc/en/pmwiki.php?n=Main/ArduinoBoardFioProgramming.

Dieser hat einen Sockel für den XBEE und nur ein Serial Interface, welches von den XBEE verwendet wird.

Das XBee Modul hängt auch an 0/1. Hast du dann am PC ein XBee Modul? Oder hängst du über einen USB Adapter am PC?

Deshalb habe ich gesagt "genau". Es ist einfach nicht klar was du da tust.

Ansonsten wenn du da nichts doppelt belegst (und das XBee Modul korrekt arbeitet) muss es gehen. Das ist z.B. bei Bluetooth auch nicht anders.

Ich verweise da vor allem auf das:

HI danke für deine Antwort und für den Tipp, es geht darum, dass ich von einem Arduino Fio daten via XBEE an einem Anderen Arduino Sende und dazu verwende ich XBEE , die über Serial laufen und mein Arduino nur 1 Serial interface hat.

Das hat sich so angehört als ob du einen Arduino hast der sendet. Und einen der empängt. Diese Verbindung belegt aber die serielle Schnittstelle. Wie schickst du die Daten dann zum PC um zu sehen was du empfangen hast?

Also ich habe zwei Arduino Fio's und an beiden sind die XBEE über den vorgesehen SOckel angeschlossen.
Einen Arduino benutzte ich zum senden via XBEE der Sensordaten im Format AWert1;Wert2+ und der Andere Arduino soll diese anhand von XBee empfangen und über den FTDI-Adatper kann ich diese im Serial Monitor überprüfen. Problem ist, dass die Daten garnicht ankommen bzw nur vereinzelt und wollte fragen, was das sein könnte bzw woran es liegt?

Sorry wenn es unklar war

Und wo ist der FTDI Adapter angeschlossen? Wenn der auch an Serial (0/1) hängt geht es nicht! Und so sieht es laut Code nämlich aus, da du einfach versuchst das Empfange mit Serial.print() zu drucken. Du kannst nicht zwei Geräte an die gleiche Schnittstelle hängen!

Du braucht SoftwareSerial oder besser gleich AltSoftSerial um dir eine weitere Schnittstelle in Software zu emulieren. Daran kannst du dann den FTDI hängen um mit dem PC zu kommunizieren.

Hier nochmal zum Fio:
https://www.arduino.cc/en/Main/ArduinoBoardFio

Serial: RXI (D0) and TXO (D1). Used to receive (RX) and transmit (TX) TTL serial data. These pins are connected to the DOUT and DIN pins of the XBee modem socket.

Dann kannst du nicht an 0/1 noch was anderes hängen

Normal macht man es so dass man Serial für die Kommunikation zum PC nimmt und die Software Schnittstelle zum anderen Gerät. Hier musst du es umgekehrt machen, da der XBee Sockel eben fest verdrahtet ist.

Hmm d.h. die Daten kommen an doch ich kann Sie nicht sehen, da ich beides angeschlossen haben?

Die beiden Geräte stören sich gegenseitig. Serial ist kein Bus, sondern eine Punkt-zu-Punkt Verbindung.

Der FDTI adapter is an folgender Anschlüssen angeschlossen:

DTR GRD, RXI, TXO, AREF, GND BLK

SIehe hier: https://www.arduino.cc/en/pmwiki.php?n=Main/ArduinoBoardFioProgramming

Sorry für die blöde Frage: aber wenn ich doch den FTDI doch angeschlossen lasse, kann ich doch auch sehen was das XBEE empfängt oder nicht? Wie sollte ich das Serial jetzt ändern für die Serielle Schnittstelle? Bzw wie kann ich dann sehen was das Zigbee empfängt?

Ok d.h. welche Geräte Arduino und das XBEE? Weil Serial wird nur verwendet in meinem Fall um Daten von einem XBEE zu dem anderen XBEE zu senden bzw zu empfangen. Wie sollte ich da die Softwarelibrary verwenden?

Ich würde die Einleseroutine noch dahin ändern, dass wenn ein A vor dem erwarteten Endekennzeichen empfangen wird, alles verworfen wird und frisch angefangen wird. Dann werden defekte Daten direkt eliminiert.

milito:
Ok d.h. welche Geräte Arduino und das XBEE? Weil Serial wird nur verwendet in meinem Fall um Daten von einem XBEE zu dem anderen XBEE zu senden bzw zu empfangen. Wie sollte ich da die Softwarelibrary verwenden?

Mach Mal ne Zeichnung, wie alles aufgebaut ist

RX = D0, TX = D1. Daran hängt schon das XBee Modul

Installiere das:
https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

Dann hast du eine Software-Schnittelle mit TX = 9 und RX = 8

Code mäßig sieht das dann so aus:

#include <AltSoftSerial.h>

AltSoftSerial altSerial;

void setup() 
{
  Serial.begin(9600);
  altSerial.begin(9600);
}

Serial ist dann XBee und altSerial ist FTDI

Die normale SoftwareSerial Library geht theoretisch auch, aber die ist nicht so zuverlässig. Du empfängst Daten vom XBee mit Serial und machst altSerial.print()/println() um sie an den PC zu senden.

Danke für den Tipp, ok d.h. daran könnte es liegen also.
Also hier die Zeichnung wie alles verbunden ist.

Der Sensor geht auch alles is gut nur das Datenübertragungsproblem besteht zum Coordinator

ElEspanol:
Ich würde die Einleseroutine noch dahin ändern, dass wenn ein A vor dem erwarteten Endekennzeichen empfangen wird, alles verworfen wird und frisch angefangen wird. Dann werden defekte Daten direkt eliminiert.

Ja, kann man machen:

if(start && c == 'A')
{
   index = 0;
}

Wie gesagt reicht ein Endzeichen bei sowas normal aus.

Ich mache es gewöhnlich einfach so:

if(c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
{
  serialBuffer[index++] = c;
}
else if(c == '\n' && index > 0)
{
  serialBuffer[index] = '\0';
  index = 0;
  return true;
}

Linefeed als Endzeichen und alles was kein Steuerzeichen ist wird abgespeichert. Dann kann man einfach println() als Abschluss senden.

Aber hier muss man endlich erst mal die Sachen richtig anschließen. Darauf habe ich schon ganz am Anfang hingewiesen :slight_smile:

Ok , also angeschlossen ist die Sensorik richtig aber anscheinend liegt es an den Serial da ich ihn für das Empfagen und den Seriel Monitor verwende?

Alternativ könnte ich ja einen Leonardo nehmen als Coordinator da er mehrere Serials hat oder die Library nehmen für den Fio? --> d.h. ich müsste den FDTI dann nicht an RXI und TXO sondern dann jeweils an 8 und 9 welche ich dann im Code für AltSoftSerial einstellen muss?