Mehrere Integers zu einem Integer oder String zusammenfügen

Hi,

ich möchte drei dreistellige Werte mit einem Funkmodul (nRF24) übertragen. Am liebsten wäre mir eine Übertragung mit einem zusammengefügten Integer oder String.

Beispiel:

Wert 1: 123 Wert 2: 456 Wert 3: 789

Zusammengefügter Wert: 123456789

Der Wert soll am Empfänger auch wieder auseinandergenommen werden.

Könnte jemand Beispielcodes senden?

Oder gibt es andere Lösungen?

Vielen Dank, Nils

struct Packet {
  int wert1;
  int wert2;
  int wert3;
} pack;

  // Sender
  pack.wert1 = 123;
  pack.wert2 = 456;
  pack.wert3 = 789;
  radio.write(&pack, sizeof(pack);

  // Empfänger
  radio.read(&pack, sizeof(pack);

Danke,

aber wie kann ich am Empfänger das "Packet" wieder aufsplitten?

Wurde gezeigt. Splitten geht nicht, bzw. wird automatisch erledigt..

Du meinst:

  // Empfänger
  radio.read(&pack, sizeof(pack));
  print(pack.wert1);

Hättest du einen vollständigen Kode gepostet könnte ich es dir zeigen.

Lies über struct und wie man auf ihre Bestandteile zugreift.

Bei write()/read() fehlt übrigens eine Klammer am Ende :slight_smile:

Snippets. Du hast natürlich recht.

struct Packet {
  int wert1;
  int wert2;
  int wert3;
} pack;

  // Sender
  pack.wert1 = 123;
  pack.wert2 = 456;
  pack.wert3 = 789;
  radio.write(&pack, sizeof(pack));

  // Empfänger
  radio.read(&pack, sizeof(pack));

Danke für die Hilfe.
Zum Projekt: Ich möchte mit einer Fernbedienung, bestehend aus zwei Schiebepotis und einem Drehpoti,
einen kleinen Panzer mit einem L293d steuern.

Hier der Code für den Sender mit euren Tipps (falls ich sie richtig verstanden habe):

//Sender

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8);

const byte address[6] = "00001";

int potiR = A1;
int potiL = A2;
int potiM = A3;

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  
 struct Packet {
  int servowert;
  int motorwertR;
  int motorwertL;
 } pack;
 
  pack.servowert = map(analogRead(A3),0,1023,0,180);
  pack.motorwertR = map(analogRead(A1),0,1023,0,255);
  pack.motorwertL = map(analogRead(A2),0,1023,0,255);
  radio.write(&pack, sizeof(pack));
  
  delay(10);
}

Hier der Code für den Empfänger:

//Empfänger

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <Servo.h>

RF24 radio(7, 8);

const byte address[6] = "00001";

Servo drehturm;

int KetteR_A =2;
int KetteR_B =3;
int KetteR_Speed = 10;
 
int KetteL_A =4;
int KetteL_B =5;
int KetteL_Speed = 11;

void setup() {
  pinMode(KetteR_A,OUTPUT);
  pinMode(KetteR_B,OUTPUT);
 
  pinMode(KetteL_A,OUTPUT);
  pinMode(KetteL_B,OUTPUT);
  
  drehturm.attach(9);
 
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}
void loop() {
  if (radio.available()) {
    struct Packet {
    int servowert;
    int motorwertR;
    int motorwertL;
    }
    radio.read(&pack, sizeof(pack));
    int servoWert = pack.servowert
    int motorWertR = pack.motorwertR;
    int motorWertL = pack.motorwertL;
    
    if(100 < motorWertR < 155){
    digitalWrite(KetteR_A,LOW);
    digitalWrite(KetteR_B,LOW);
    analogWrite(KetteR_Speed,0);
    }
    if(motorWertR > 155){
    digitalWrite(KetteR_A,HIGH);
    digitalWrite(KetteR_B,LOW);
    analogWrite(KetteR_Speed,motorWertR);
    }
    if(motorWertR < 100){
    digitalWrite(KetteR_A,LOW);
    digitalWrite(KetteR_B,HIGH);
    analogWrite(KetteR_Speed,motorWertR);
    }

    if(100 < motorWertL < 155){
    digitalWrite(KetteL_A,LOW);
    digitalWrite(KetteL_B,LOW);
    analogWrite(KetteL_Speed,0);
    }
    if(motorWertL >155){
    digitalWrite(KetteL_A,HIGH);
    digitalWrite(KetteL_B,LOW);
    analogWrite(KetteL_Speed,motorWertL);
    }
    if(motorWertL < 100){
    digitalWrite(KetteL_A,LOW);
    digitalWrite(KetteL_B,HIGH);
    analogWrite(KetteL_Speed,motorWertL);
    }
    
    drehturm.write(servoWert);
  }
 
}

Allerdings gibt mir der Kompiler da ne Fehlermeldung raus:

Empfeanger:44: error: expected initializer before ‘.’ token

radio.read(&pack, sizeof(pack));

^

Empfeanger:45: error: ‘pack’ was not declared in this scope

int servoWert = pack.servowert

^

Empfeanger:49: error: ‘motorWertR’ was not declared in this scope

if(100 < motorWertR < 155){

^

Empfeanger:54: error: ‘motorWertR’ was not declared in this scope

if(motorWertR > 155){

^

Empfeanger:59: error: ‘motorWertR’ was not declared in this scope

if(motorWertR < 100){

^

exit status 1
expected initializer before ‘.’ token

Das struct gehört nicht in loop()! Du definierst da praktisch eine eigene Variable

Was lokal sein ist das Erstellen einer Instanz des structs. Das ist was hier am Ende gemacht wird:

 } pack;

Das könnte man auch trennen. Aber der Teil davor muss global sein

Getrennt ist es so:

//muss global sein
struct Packet 
{
  int wert1;
  int wert2;
  int wert3;
};

Packet packet;   //das kann u.U. lokal sein

Auch beachten dass am Ende der struct Definition ein Strichpunkt kommt. Der wird auch oft vergessen

Verstehe bitte was gemacht wird anstatt nur blind den Code zu kopieren. Das sollte nicht zu schwer sein und du kannst es noch öfters anwenden

Also so:

Empfänger:

//Empfänger

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <Servo.h>

RF24 radio(7, 8);

const byte address[6] = "00001";

Servo drehturm;

int KetteR_A =2;
int KetteR_B =3;
int KetteR_Speed = 10;
 
int KetteL_A =4;
int KetteL_B =5;
int KetteL_Speed = 11;

struct Packet {
    int servowert;
    int motorwertR;
    int motorwertL;
    };

void setup() {
  pinMode(KetteR_A,OUTPUT);
  pinMode(KetteR_B,OUTPUT);
 
  pinMode(KetteL_A,OUTPUT);
  pinMode(KetteL_B,OUTPUT);
  
  drehturm.attach(9);
 
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}
void loop() {
  if (radio.available()) {
    Packet packet;
   
    radio.read(&packet, sizeof(packet));
    int servoWert = packet.servowert;
    int motorWertR = packet.motorwertR;
    int motorWertL = packet.motorwertL;
    
    if(100 < motorWertR < 155){
    digitalWrite(KetteR_A,LOW);
    digitalWrite(KetteR_B,LOW);
    analogWrite(KetteR_Speed,0);
    }
    if(motorWertR > 155){
    digitalWrite(KetteR_A,HIGH);
    digitalWrite(KetteR_B,LOW);
    analogWrite(KetteR_Speed,motorWertR);
    }
    if(motorWertR < 100){
    digitalWrite(KetteR_A,LOW);
    digitalWrite(KetteR_B,HIGH);
    analogWrite(KetteR_Speed,motorWertR);
    }

    if(100 < motorWertL < 155){
    digitalWrite(KetteL_A,LOW);
    digitalWrite(KetteL_B,LOW);
    analogWrite(KetteL_Speed,0);
    }
    if(motorWertL >155){
    digitalWrite(KetteL_A,HIGH);
    digitalWrite(KetteL_B,LOW);
    analogWrite(KetteL_Speed,motorWertL);
    }
    if(motorWertL < 100){
    digitalWrite(KetteL_A,LOW);
    digitalWrite(KetteL_B,HIGH);
    analogWrite(KetteL_Speed,motorWertL);
    }
    
    drehturm.write(servoWert);
  }
 
}

Sender:

//Sender

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8);

const byte address[6] = "00001";

int potiR = A1;
int potiL = A2;
int potiM = A3;

struct Packet {
  int servowert;
  int motorwertR;
  int motorwertL;
  };

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  
  Packet packet;
 
  packet.servowert = map(analogRead(A3),0,1023,0,180);
  packet.motorwertR = map(analogRead(A1),0,1023,0,255);
  packet.motorwertL = map(analogRead(A2),0,1023,0,255);
  radio.write(&packet, sizeof(packet));
  
  delay(10);

Aber der Teil davor muss global sein

Hmmm...

Nöö.

Vielleicht "kann", oder gar "sollte". Je nach dem. Aber nicht "muss".

Aber in einem gebe ich dir Recht: In den meisten Anwendungen wird man die Struktur Definition im globalen Namensraum haben wollen. Und dem Anfänger sei geraten, es auch so zu tun. Und zwar, bis es einen überzeugenden Grund gibt, das lokal zu tun.