C++ Frage zu Arduino-Beispieldatei

von Schnitzel

Captain
Registriert
Apr. 2008
Beiträge
3.903
Guten abend,
ich hab erst vor kurzem wg. einem Arbeitskollegen angefangen mit Programmierenlernen um einen Arduino anzusteuern.
Beim studieren einer Beispieldatei eines GSM-Modules bin ich auf etwas gestoßen, was ich noch nicht so ganz blicke.
Hier ein Auszug:

Code:
// FONA Incoming Call Number Example
// Listens for a call and displays the phone number of the caller (if available).
// Use this example to add phone call detection to your own FONA sketch.
#include "Adafruit_FONA.h"

// Pins which are connected to the FONA.
// Note that this is different from FONAtest!
#define FONA_RX            3
#define FONA_TX            4
#define FONA_RST           5

// Note you need to map interrupt number to pin number
// for your board.  On an Uno & Mega interrupt 0 is
// digital pin 2, and on a Leonardo interrupt 0 is
// digital pin 3.  See this page for a complete table:
//   http://arduino.cc/en/Reference/attachInterrupt
// Make sure this interrupt pin is connected to FONA RI!
#define FONA_RI_INTERRUPT  0

// We default to using software serial. If you want to use hardware serial
// (because softserial isnt supported) comment out the following three lines 
// and uncomment the HardwareSerial line
#include <SoftwareSerial.h>
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
SoftwareSerial *fonaSerial = &fonaSS;

// Hardware serial is also possible!
//  HardwareSerial *fonaSerial = &Serial1;

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

void setup() {
  Serial.begin(115200);
  Serial.println(F("FONA incoming call example"));
  Serial.println(F("Initializing....(May take 3 seconds)"));

  fonaSerial->begin(4800);
  if (! fona.begin(*fonaSerial)) {
    Serial.println(F("Couldn't find FONA"));
    while(1);
  }

Um genauer zu sein, geht es nur um "if (! fona.begin(*fonaSerial)) {"
Dass der ganze Teil bewirkt, dass wenn keine Verbindung hergestellt werde kann, der Text "Couldn't find FONA" ausgegeben/angezeigt wird, ist mir klar, aber für was genau steht "(*fonaSerial)"? Steht das für die Baudrate?

Thx im Voraus.
 
https://github.com/adafruit/Adafruit_FONA/blob/master/Adafruit_FONA.h#L70

Das ist etwas komisch gelöst an dieser Stelle. Adafruit_FONA::begin() nimmt eine Referenz auf ein FONAStreamType-Objekt (z.B. Adafruit_FONA als Type). In der Variable fonaSerial speicherst Du einen Pointer auf so ein Objekt (dieses "Objekt" ist auch unter dem Namen fonaSS verfügbar). Da du für begin() jedoch ein Objekt brauchst, und nicht einen Pointer, muss dieser Pointer zuerst dereferenziert ("aufgelöst") werden, das macht der *-Operator.

Etwas eleganter könntest Du schreiben:
Code:
if (!fona.begin(fonaSS)) {
 
Thx für die schnelle Antwort.
Dann steht das nicht für die Baudrate, sondern für eine Verbindung an sich. Sehe ich das richtig?
 
Quasi. Theoretisch könntest Du ja mit dem Modem auf verschiedene Arten sprechen, ob nun UART, SPI, I2C, ... solange das Protokoll stimmt und die Daten beim Modem ankommen, sollte das egal sein. Deswegen haben die dort einen Abstraktion Layer eingezogen, der den Kommunikationsweg mit dem Modem darstellt, in diesem Fall ein SoftwareSerial (ich tippe UART via Software-Modul). Wenn du Hardware-Serial hast (beim Arduino Uno auf Pin 0, RX und Pin 1 TX), kannst Du den HardwareSerial-Channel wählen (siehe Kommentar im Code).
 
Oh man, ich hab noch eine langen Weg vor mir...

Edit:
Am Arduino hängt noch ein GPS-Modul, dessen Werte ich über den SerialMonitor anzeigen lasse und ein SD-Kartenleser. Das GPS-Modul hab ich an Pin 2 und 3 angeschlossen, daher sind 0 und 1 weg. Ich muss mir daher noch überlegen, wie ich alles gleichzeitig zum laufen bekomme.
 
Zuletzt bearbeitet:
UART kann man einigermaßen erfolgreich in Software implementieren (eben über SoftwareSerial), da stehst du dir schonmal nicht im Weg.
Die SD-Card Logger die ich so kenne, arbeiten mit SPI, also einem BUS-System. Da führst du einfach einmal alle Datenleitungen vom Arduino an alle angebundenen Chips und schaltest deren "Empfang" dann über die Chip-Select (CS) Leitung scharf. Davon brauchst du dann eine pro angeschlossenem BUS-Teilnehmer, das kann jedoch ein simpler Digital-IO PIN sein.

Vielleicht hilft das: https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi#multiple
 
Du hast 2x UART und 1x SPI. Das bekommst Du auf jedem Arduino unter. Ich schätze, dass dein GSM-Modul mehr Bandbreite benötigt, tendenziell würde ich also dieses über den Hardware-Kanal (Pin 0 und 1) anbinden und das GPS-Modul über SoftwareSerial.
 
Lt. dieser Seite kann man wohl nur entweder HardwareSerial oder nur SoftwareSerial benutzen, aber nicht beides gleichzeitig.

P.S.
Hast du schon mal etwas mit so einem SD-Kartenmodul gemacht?
Ich hab ein einfaches Sketch zusammengeschrieben um das Modul zu testen, aber es schreibt nur Dateien ohne Endung und erstellt irgendwelche Ordner; beides aber auch nur mit kryptischen Zeichen. Ich verwende eine alte 32 MB SD-Karte zum Testen, darauf wurde angeblich auch eine Datei mit 129 MB erstellt - wtf...
MicroSD-Karten werden scheinbar nicht akzeptiert, da ich immer die "Card failed..."-Meldung bekomme. Andere normale SD-Karten hab ich nicht.

Hier mein letzter Versuch; dabei wird sogar die Textdatei erst erstellt und dann eine Sekunde gewartet bevor der Text geschrieben wird.
Code:
#include <SD.h>
#include <SPI.h>
#include <SoftwareSerial.h>

const int chipSelect = 4;

File testFile;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Initializing SD card ...");
  pinMode(10, OUTPUT);

  if (!SD.begin(chipSelect))
  {
    Serial.println("Card failed, or not present. Please insert");
    while(1);
  }

  testFile = SD.open("test.txt", FILE_WRITE);
  delay(1000);
  testFile.print("dies ist ein Test");
  testFile.println("zweite Zeile");
  testFile.close();

  Serial.println("Write done");
}
void loop() {}

P.P.S.
Nochmal Thx, dass du das Interesse noch nicht verloren hast. :)
 
Zuletzt bearbeitet:
Klingt, als ob dein Dateisystem kaputt ist. Kannst du die SD-Karte neu formatieren?
Ansonsten findest du in der Arduino IDE eine Menge Beispiele für die SD-Card-Adapter: Datei > Beispiele > SD

Kannst du noch ein Schemata deiner Schaltung hochladen? Mit Fritzing kannst du das einfach visualisieren.
 
Ich hab die Karte nach jedem Versuch formatiert, da sogar die Volumenbezeichnung weg war.
Ich teste gleich noch einige der Beispiele.

Ich bin ab heute Mittag außer Haus, nehme aber mein Tablet mit und bastel das Schemata (ich kann mich irgendwie nicht mit diesem Wort anfreunden ...) zusammen.
Bis später.

Edit:
Auf dieser Seite gibt es einen Lösungsansatz.

Edit 2:
So, ist war nich direkt in Fritzing entstanden, aber mit Screenern davon. ^^
Das GSM-Modul ist noch nicht dran, da erst diese beiden funktionieren sollen - also eigentlich das SD-Modul. Das GPS-Modul läuft eingermaßen. Das einzigen, was mich stört, ist dass des öfteren die NMEA-Sätze (GGA und RMC, alle anderen hab ich ausgeblendet) nicht untereinander stehen, sondern ab und zu hintereinander, oder einer ausgelassen wird. Das ist aber wohl der fehlenden Synchronisationsmöglichkeit geschuldet - bzw. meiner Noch-Unkenntnis diese irgendwie einzustellen.

Dies ist übrigens die Vorlage. Er hält sich, wie man an der Namenswahl merkt, ziemlich an den Beispieldateien.
 

Anhänge

  • Datalogger.jpg
    Datalogger.jpg
    252,5 KB · Aufrufe: 181
Zuletzt bearbeitet:
Zurück
Oben