Problem bei der Umwandlung eines Bytes in ein Integer nach Wireless Übertragung

Wie schon im Titel steht habe ich ein Problem damit, dass nachdem ich Bytes von einem anderen Arduino per funk zu einem anderen schicken will. Dieser muss diese jedoch für eine Switch in ein Integer Wert umwandeln irgendwie funktioniert das bei mir nicht. Das Problem liegt also beim Receiver vor der Switch.

Hier der Code:

Transmitter:

#include <VirtualWire.h>
int x;
void setup()
{
Serial.begin(9600);
vw_setup(2000);
}
void loop()
{
if (Serial.available() > 0) {
x = Serial.read();
x = x - 48;
 
switch (x) {
case 1:
send("1");
break;
 
case 2:
send("2");
break;
 
case 3:
send("3");
break;
 
case 4:
send("4");
break; 
 
case 5:
send("5");
break;
}
}
}
void send (char *message)
{
vw_send((uint8_t *)message, strlen(message));
vw_wait_tx();
}

Receiver:

#include <VirtualWire.h>
byte message[VW_MAX_MESSAGE_LEN];
byte messageLength = VW_MAX_MESSAGE_LEN;
#include <AFMotor.h>
AF_DCMotor motor_01(1, MOTOR12_64KHZ);
AF_DCMotor motor_02(2, MOTOR12_64KHZ);
AF_DCMotor motor_03(3, MOTOR12_64KHZ);
AF_DCMotor motor_04(4, MOTOR12_64KHZ);
int x;
 
void setup()
{
motor_01.setSpeed(175);
motor_02.setSpeed(175);
motor_03.setSpeed(175); 
motor_04.setSpeed(175);
Serial.begin(9600);
Serial.println("Device is ready");
vw_setup(2000);
vw_rx_start();
vw_set_rx_pin(31);
}
void loop()
{
if (vw_get_message(message, &messageLength))
{
Serial.print("Zahl: ");
for (int i = 0; i < messageLength; i++)
{
Serial.write(message[i]);
x = int(message[i]);                //Hier beginnt das Problem
Serial.write(x);
Serial.println();
 
switch(x){
  case 1:
    vor();
    break;
 
  case 2:
    links();
    break;
 
  case 3:
    rechts();
    break;
 
  case 4:
    zurueck();
    break; 
 
  case 5:
    stopp();
    break;
    }
    }
  }  
}
  void vor(){
    motor_01.run(BACKWARD);
    motor_02.run(BACKWARD);
    motor_03.run(BACKWARD);
    motor_04.run(BACKWARD);
  }
 
  void links(){
    motor_01.run(BACKWARD);
    motor_02.run(BACKWARD);
    motor_03.run(FORWARD);
    motor_04.run(FORWARD);
  }
 
  void rechts(){
    motor_01.run(FORWARD);
    motor_02.run(FORWARD);
    motor_03.run(BACKWARD);
    motor_04.run(BACKWARD);
  }
 
  void zurueck(){
    motor_01.run(FORWARD);
    motor_02.run(FORWARD);
    motor_03.run(FORWARD);
    motor_04.run(FORWARD);
  }
 
  void stopp(){
    motor_01.run(RELEASE);
    motor_02.run(RELEASE);
    motor_03.run(RELEASE);
    motor_04.run(RELEASE);
}

Hallo,

schreibe int mal mit Klammer. Sollte funktionieren.

x = (int) (message*); *

Funktioniert nicht. Die Zahl wird zwar umgewandelt und auch als z.B. 1 wieder ausgegeben aber die Switch wird trotzdem nicht aktiviert ... :relaxed:

Du kommst da glaube ich mit ASCII und Zahlen durcheinander. Auf der Senderseite zieht du zwar bei Serial 48 ab, aber dann sendest du gleich wieder einen String und damit ASCII. Auf der Empfangsseite behandelst du das dann wie eine Zahl und das geht natürlich schief.

Ist das auf der Empfangsseite ein Null-Terminierter C-String, wie es den Anschein hat? Wenn ja, dann ist es das vernünftigste entweder den Vergleich mit strcmp() zu machen, oder die Zahl erst mal mit atoi() in einen Integer zu wandeln. Letzteres ist hier besser, da man danach switch/case verwenden kann.

Probier mal:

int x = atoi(message);

atoi = array to integer

EDIT:
Allerdings passt das mit deiner for-Schleife da auch nicht wirklich:

for (int i = 0; i < messageLength; i++)
{
}

Das ist vor allem totaler Unsinn da messageLength die MAXIMAL-Länge ist und nicht die tatsächliche Länge. Du schickst ein Zeichen, aber dein Array ist viel größer. Wieso also über Indizes iterieren und denen gar keine Nutzdaten stehen?

Das würde ich mal weglassen. Und einfach “message” als ganzes bearbeiten

Mhhh... wenn ich dein Code-Schnipsel verwende kommt da " invalid conversion form 'byte*' to 'const char*' " Wie meinst du das mit dem verwechseln ? Wie würdest du das denn machen ?

Ich hab die for-Schleife jetzt weggelassen aber weiß nicht genau was ich machen soll. Bin leider noch voll Anfänger

Mhh, habe mit der Klasse noch nichts gemacht. Deshalb verwirrt mich das jetzt auch etwas. Einerseits werden Strings versendet. Andererseits, hat man byte Arrays. Geht wohl mit beidem je nachdem wie man es behandelt.

Mach vielleicht mal nach dem Auslesen Serial.print(x) statt Serial.write(x). print() ist für ASCII. Das sieht nämlich irgendwie so aus als ob da ASCII sendest und das dann als Binär-Daten behandelst. Man kann das schon so Byte für Byte betrachten, aber dann musst du wieder -48 machen um von ASCII auf die jeweilige Ziffer zu kommen. Oder statt auf 1 auf '1' switchen.

Das mit der for-Schleife wird auch in den Beispielen zur VirtualWire Lib gemacht. Dann wird es vielleicht schon seinen Sinn haben...

Hat vielleicht noch irgendwer ne Idee wie ich den Code zum laufen bekommen ohne ihn ganz umzustellen ?

x = int(message*); //Hier beginnt das Problem[/quote]* Dann mach's doch so: ``` byte x = message[i]; switch (x)   case 0: break; // Endekennung ignorieren   case '1':    // Einfache Anführungszeichen !  Oder, entsprechend zum Sender-Sketch : 1 + 48     vor();     break; ``` die Globale inx x; brauchst du übrigens nicht !

Hat funktioniert hab jetzt zwar ein paar andere Probleme aber die werd ich sicherlich noch alleine hinbekommen