[SOLUCIONADO] Conseguir pasar string

Buenas a todos,

Tengo un problemilla en mi programa de arduiino. Estoy usando un esp8266 para enviar los codigos de mi mando de tv almacenados en una BBDD a mi esp para que este lo mando por infrarrojos todo bien salvo que desde mi BBDD le paso el codigo correcto pero a traves de un string que es lo que se envia entonces al recibirlo ese string no puedo ponerlo en la funcion irsend.sendRC5(...) ya que eso recibe un unsigned long int. Tampoco puedo convertirlo a unsigned long int porque como recibo un string y ese string contiene letras si lo convierto a int me cambia totalmente el codigo y ya no sirve. Alguien puede echar una mano?

Adjunto codigo:

unsigned long int codigo; 
String cod;

cod = client.readString(); //leemos el codigo del servidor

irsend.sendRC5(codigo, results.bits);   //realiza el envio

como consigo esa variable cod de tipo string que se envie tal y como esta a la funcion sendRC5 que lo que recibe es unsigned long int?

Gracias y un saludo.

No recibe letras, recibes un número hexadecimal de 4 bytes

esto

cod = client.readString(); //leemos el codigo del servidor

quien lo envía?

desde mi servidor django envio por socket el codigo que es 20DF10EF si imprimo por serial la variable cod recibo bien ese codigo, pero cod es de tipo string.

Bueno convierte eso a número, simplemente quitando '0' si es número y si es letra le quitas 'A' y ya lo tienes. Rearma el hexadecimal uint32_t y asunto resuelto.

Esto puede servir

unsigned long x2i(char *s) 
{
 unsigned long x = 0;
 for(;;) {
   char c = *s;
   if (c >= '0' && c <= '9') {
      x *= 16;
      x += c - '0'; 
   }
   else if (c >= 'A' && c <= 'F') {
      x *= 16;
      x += (c - 'A') + 10; 
   }
   else break;
   s++;
 }
 return x;
}

Esto es lo que tengo de codigo:

      cod = client.readString(); //leemos el codigo del servidor
      
      Serial.println("DENTRO COD: ");
      Serial1.println("DENTRO COD: ");
      Serial.println(cod);
      Serial1.println(cod);
      Serial.println("LUEGO");
      Serial1.println("LUEGO");

      
      
      cod.toCharArray(cadena, 64); //lo convertimos en char

      codigo= x2i(cadena);
      
      Serial.println("DESPUES CODIGO: ");
      Serial1.println("DESPUES CODIGO: ");
      Serial.println(codigo);
      Serial1.println(codigo);






unsigned long x2i(char *s) 
{
 unsigned long x = 0;
 for(;;) {
   char c = *s;
   if (c >= '0' && c <= '9') {
      x *= 16;
      x += c - '0'; 
   }
   else if (c >= 'A' && c <= 'F') {
      x *= 16;
      x += (c - 'A') + 10; 
   }
   else break;
   s++;
 }
 return x;
}

El valor de cod = 20DF10EF
y el valor de codigo= 551489775

Porque debes mostrarlo en hexa

Serial.println(codigo, HEX);

Lucena deja de poner códigos parciales, tu variable código no se de que tipo es?

perdon por no poner codigo completo ni por no poder contestar antes, pues me ha sido imposible.

Este es el codigo completo:

#include <IRremoteESP8266.h>
#include <ESP8266WiFi.h>
#include <stdlib.h>

/*

const char* ssid = "wifi";
const char* password = "password";

//Configurar IP estatica
IPAddress ip(192, 168, 0, 169);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

/**************VARIABLES GLOBALES **************************/
int RECV_PIN = D3;
IRrecv irrecv(RECV_PIN);
IRsend irsend(D0);
decode_results results;
long ciclos = 0;
/**********************************************************/

WiFiServer server(8000); //just pick any port number you like

void setup(){
  Serial.begin(9600);
  Serial1.begin(9600);
  irrecv.enableIRIn(); // comenzar recpcion 
  irsend.begin(); //comenzar envio
  
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    Serial1.print(".");
  }

  // Start the server
  server.begin();
}

void loop() {
  unsigned long int codigo; 
  String req;
  String cod;
  char cadena[64];
  int i=0;
  WiFiClient client = server.available();

  
  if (irrecv.decode(&results)) {
    delay(200);
    irrecv.resume(); // resume receiver
  }

  if (!client) {
    return;
  }

    // Read the first line of the request
    req = client.readStringUntil('\r');
    Serial.println("REQ: ");
    Serial1.println("REQ: ");
    Serial.println(req);
    Serial1.println(req);
    client.flush();
    client.print("OK"); //le enviamos el codigo al servidor, para que reciba el codigo aparte 
    client.flush();
  
    if (req.indexOf("SEND") != -1) { //si pide enviar el codigo 
      cod = client.readString(); //leemos el codigo del servidor
      
      Serial.println("DENTRO COD: ");
      Serial1.println("DENTRO COD: ");
      Serial.println(cod);
      Serial1.println(cod);
      Serial.println("LUEGO");
      Serial1.println("LUEGO");

      
      
      cod.toCharArray(cadena, 64); //lo convertimos en char

      codigo= x2i(cadena);
      
      Serial.println("DESPUES CODIGO: ");
      Serial1.println("DESPUES CODIGO: ");
      Serial.println(codigo);
      Serial1.println(codigo);
      
      irsend.sendRC5(codigo, results.bits);   //realiza el envio
      irsend.sendNEC(codigo, results.bits);   //realiza el envio
      irsend.sendSony(codigo, results.bits);   //realiza el envio
      irsend.sendRC6(codigo, results.bits);   //realiza el envio
    }
    else{ //si pide sincronizar
      client.print(results.value,HEX); //le enviamos el codigo al servidor
    }

  client.flush();
}

unsigned long x2i(char *s) 
{
 unsigned long x = 0;
 for(;;) {
   char c = *s;
   if (c >= '0' && c <= '9') {
      x *= 16;
      x += c - '0'; 
   }
   else if (c >= 'A' && c <= 'F') {
      x *= 16;
      x += (c - 'A') + 10; 
   }
   else break;
   s++;
 }
 return x;
}

asi tal y como esta el codigo es cierto que la funcion x2i me convierte el string hexadecimal en un unsigned long pero claro en tipo decimal, pero el problema es que la funcion irsend.sendRC5(); recibe un valor unsigned long pero con valor en hexadecimal y el que yo tengo viene en decimal

vale, ya esta solucionado todo, aun que le mande el codigo en decimal la TV lo acaba cogiendo bien.

Muchas gracias por la ayuda surbyte!

Bueno creo que ya lo explicate y yo pensaba que no asi que edito este comentario mío.
Edita el titulo y agrega [SOLUCIONADO]