Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:

THEMA:

Neues Beispiel für "Adafruit BLE UART friend" 05 Dez 2017 22:40 #43

  • Eckehard
  • Eckehards Avatar
  • Offline
  • Senior Boarder
  • Senior Boarder
  • Beiträge: 54
  • Dank erhalten: 6
Hallo Bernd,

cool, danke für den Einblick auf Deinen Aufbau....und... für die erneute Bereitstellung des Beispiel Code für Adafruit....Modul !
Werde ich mir bei Gelegenheit anschauen.

ich werde erstmal mit dem HC05 weitermachen.... vielleicht finde ich ja noch das passende AT+ Kommando raus, was die Sendeleistung reduziert....
und ich warte auf das Eintrudeln der HC12, also 433MHz Module....

BTW: Ich habe meinen Fehler gefunden:

mit:

...
/*
Eingehende Message: <GPS 3276a409 9 HDOP 0.00>
Geparste Variablen: SENSOR=GPS SERIAL=3276A409 ID=9 LABEL=HDOP VALUE=0 sscanf=5
*/
uint32_t serial;
int id;
int value;
char sensor[10];
char label[10];

int n = sscanf(buffer,"<%s %lx %d %s %d>", &sensor, &serial, &id, &label, &value);

Serial.print("SENSOR=");
Serial.print(sensor);
Serial.print(" SERIAL=");
Serial.print(serial,HEX);
...


ich hatte die Variable serial nur als einfachen int deklariert.... muss uint32_t sein. Typischer Anfängerfehler....

Jetzt habe ich auch nach dem Parsen die gewünschte Ausgabe:
SENSOR=GPS SERIAL=3276A409 ID=9 LABEL=HDOP VALUE=0 sscanf=5

ok, weiter gehts.... :)

Grüße
Eckehard

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Letzte Änderung: von Eckehard.

Neues Beispiel für "Adafruit BLE UART friend" 06 Dez 2017 14:48 #44

  • Sepp62
  • Sepp62s Avatar Autor
  • Offline
  • Gold Boarder
  • Gold Boarder
  • Beiträge: 289
  • Dank erhalten: 134
Hallo Ekkehard,

da hast Du doch schon einiges geschafft. Arbeitest Du schon mit echten Daten vom Sender oder ist das "Simulation" ?

Bin gespannt auf den Teil mit der Brille !

VG Bernd

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Neues Beispiel für "Adafruit BLE UART friend" 06 Dez 2017 16:40 #45

  • Eckehard
  • Eckehards Avatar
  • Offline
  • Senior Boarder
  • Senior Boarder
  • Beiträge: 54
  • Dank erhalten: 6
Hallo,

Nene, nix simuliert, das ist Feld Test mit
- Teensy über ca. 50cm Kabel direkt am Port des Senders...
- vom Teensy über Bluetooth (2x HC05) zu einem
- arduino Micro... (an den das OLED Display noch angeklemmt werden soll...)

Auf der "Modell" Seite läuft ein RX 5 mit RCThoughts GPS Sensor, der ja auch Deine Sensor Lib verwendet....
Werde demnächst mal einen unisens von SM testen....

BTW: Mußte den Sender diese Woche schon zwei mal nachladen.... Das wünschte ich mir manchmal im Sommer, wenn man Fliegen geht... ;-)

Ja, die Brille, das ist dann eher ein Problem aus dem Bereich Optik...Mechanik und einwenig Design..... Bin auch gespannt...

Aber vorher sind noch arduino / Elektronik Nüsse zu knacken....

- schreiben der eintreffenden/geparsten Daten in structs
- Ausgeben der structs Daten (label, value, unit) auf dem Mini OLED (0,66")
- Button zum "durchscrollen" der einzelnen id s.
- HC12 Strecke statt HC05 BT Strecke
- Lipo Zelle und Ladeelektronik zur Versorgung der Elektronik in der Datenbrille

Grüße
Eckehard

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Letzte Änderung: von Eckehard.

Neues Beispiel für "Adafruit BLE UART friend" 06 Dez 2017 22:13 #46

  • Eckehard
  • Eckehards Avatar
  • Offline
  • Senior Boarder
  • Senior Boarder
  • Beiträge: 54
  • Dank erhalten: 6
Hallo Bernd,

hätte da noch folgendes Problemchen:

Habe mir ein struct dataset_type definiert.
Weiterhin ein array ex_data mit max. 32 Einträgen, vom typ dataset_type...
Mit einem switch ... case (id) möchte ich das array befüllen.....

Mit Datentypen uint32_t und int klappt das, beim Versuch ein char array wie ds_sensor[10] oder ds-label[10] zu befüllen meckert der Compiler schon...

Fehler beim Kompilieren:
Bluetooth_Slave_2017_12_06:68: error: invalid array assignment

ex_data[0].ds_sensor = sensor;

^


Konkret möchte ich für id = 1 z.B. folgendes tun: (array index 0 mit den aktuellen geparsten Datensatz befüllen)

...
ex_data[0].ds_label = label; // Führt zu Compiler Fehler
ex_data[0].ds_serial = serial; // Funktioniert
...


Ich komme nicht dahinter, weil zuwenig Erfahrung....
Hast Du einen Tipp?

Hier der relevante Code Auszug:

typedef struct {
char ds_sensor[10];
uint32_t ds_serial;
int ds_id;
char ds_label[10];
int ds_value;
} dataset_type;

dataset_type ex_data[32];


void setup() {
...
} // void setup

void loop() {

static char buffer[80] = "<GPS 3276a409 1 Course 10.00>";
char sensor[10];
uint32_t serial;
int id;
char label[10];
int value;

// einlesen
if (readline(mySerial.read(), buffer, 80) > 0) {
Serial.println(buffer);

//parsing
int n = sscanf(buffer,"<%s %lx %d %s %d>", &sensor, &serial, &id, &label, &value);
Serial.print("SENSOR="); Serial.print(sensor); Serial.print(" SERIAL="); Serial.print(serial,HEX); Serial.print(" ID="); Serial.print(id); Serial.print(" LABEL="); Serial.print(label); Serial.print(" VALUE="); Serial.print(value); Serial.print(" sscanf="); Serial.println(n);

switch (id) {
case 1 :
// ex_data[0].ds_sensor = sensor;
// ex_data[0].ds_label = label;
ex_data[0].ds_serial = serial;
ex_data[0].ds_id = id;
ex_data[0].ds_value = value;
Serial.print(ex_data[0].ds_sensor); Serial.print(":"); Serial.print(ex_data[0].ds_serial, HEX); Serial.print(":"); Serial.print(ex_data[0].ds_id); Serial.print(":"); Serial.print(ex_data[0].ds_label); Serial.print(":"); Serial.println(ex_data[0].ds_value);
break;

case 2 :
// ex_data[1].ds_sensor = sensor;
// ex_data[1].ds_label = label;
ex_data[1].ds_serial = serial;
ex_data[1].ds_id = id;
ex_data[1].ds_value = value;
Serial.print(ex_data[1].ds_sensor); Serial.print(":"); Serial.print(ex_data[1].ds_serial, HEX); Serial.print(":"); Serial.print(ex_data[1].ds_id); Serial.print(":"); Serial.print(ex_data[1].ds_label); Serial.print(":"); Serial.println(ex_data[1].ds_value);
break;

case 3 :
...



Danke schonmal für eine Tipp bzw. Link

Grüße
Eckehard

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Letzte Änderung: von Eckehard.

Neues Beispiel für "Adafruit BLE UART friend" 07 Dez 2017 13:05 #47

  • Sepp62
  • Sepp62s Avatar Autor
  • Offline
  • Gold Boarder
  • Gold Boarder
  • Beiträge: 289
  • Dank erhalten: 134
Hallo Eckehard,

Du musst Deine Strings kopieren und darfst nicht einfach nur den Zeiger an das Array zuweisen.

Statt
ex_data[0].ds_sensor = sensor;

musst du schreiben:

strcpy( ex_data[0].ds_sensor, sensor );

Noch "korrekter" wäre es, wenn Du die Funktion "strncpy" hernimmst, die ist aber so dämlich, dass sie, wenn der Zielspeicherplatz zu klein ist, keine terminierende Null anhängt. D.h. wenn man alles richtig machen will, wird der Code unübersichtlich, daher verzichte ich auf die Darstellung.

Hier findest Du Näheres zu strcpy und strncpy:
www.c-howto.de/tutorial/strings-zeichenk...en/strings-kopieren/

Das C/C++-Grundsatzthema "was sind Arrays und was sind Pointer" ist ein Dauerbrenner und wirklich nicht leicht zu verstehen. Hier zwei Erklärungen:
openbook.rheinwerk-verlag.de/c_von_a_bis_z/012_c_zeiger_007.htm
eli.thegreenplace.net/2009/10/21/are-poi...rays-equivalent-in-c

Diese hier gefällt mir eigentlich am Besten:
mat1.uibk.ac.at/download/stix/C%20und%20...20C++-Referenzen.PDF

Das Gute ist, dass einem die Compiler (inzwischen) relativ zuverlässig sagen, wo man Mist gemacht hat. Ausgenommen sind Fälle, wo man Speicher z.B. auf dem Stack verwendet und einen Pointer auf diesen ganz woanders verwendet (also in nicht untergeordneten Funktionen).

Man lernt das aber dadurch, dass einfach "nichts geht" relativ schnell und sollte sich durch Abstürze nicht entmutigen lassen. Irgendwann hat man dann seine "Programm-Muster", die funktionieren. Zuverlässiger ist es natürlich, wenn man es wirklich verstanden hat, aber das kommt mit der Zeit fast von selbst.

Viel Erfolg !

Viele Grüße
Bernd
Folgende Benutzer bedankten sich: Eckehard

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Neues Beispiel für "Adafruit BLE UART friend" 11 Dez 2017 14:31 #48

  • Eckehard
  • Eckehards Avatar
  • Offline
  • Senior Boarder
  • Senior Boarder
  • Beiträge: 54
  • Dank erhalten: 6
Hallo Bernd,

Danke!

Mit diesen Tipps bin ich jetzt auf dem richtigen Weg.... Die Daten Struktur konnte ich damit befüllen

- Leider habe ich mir irgendwie den Arduino Micro so zerschossen, daß dieser nicht mehr als USB Gerät erkannt wird...Daher mußte ich auf einen Pro Mini umgestiegen, zwar etwas früher wie geplant...

+ mittlerweile zeigt das OLed auch schon (Test-Telemetrie-) Daten an....
+ mit einem Taster kann ich durch die einzelnen IDs "springen"...
+ alle ankommenden Telemetrie Werte werden erstmal nur in die DatanStruktur gepumpt.
+ "parallel" läuft ein ISR Timer Interrupt, der 2 x in der Sekunde die Datenausgabe tätigt...

Es sind aber noch diverse Fehler zu fixen und auch finden....ich blebe drann.


Danke und Grüße

Eckehard
Folgende Benutzer bedankten sich: Sepp62

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Ladezeit der Seite: 0.277 Sekunden
Powered by Kunena Forum