Hola a todos los arduino-adictos:
Estoy tratando de realizar el siguiente calculo. Disculpad por mis pequeños conocimientos del lenguaje pero no soy capaz de conseguirlo.
Se trata de a partir de un String de 4 bytes HEX, por ejemplo CE 5A 82 FE:
Necesitaria:
1.- Invertir la cadena: FE 82 5A CE.
2.- Convertirla a código binario.
3.- Realizar el cálculo que muestro a continuación.
4.- Una funcion que me muestre el resultado de la suma de la columna “value” (4269955790).
FE 82 5A CE
11111110 10000010 01011010 11001110
value
E
0 0 0 * (2^0) = 0
1 1 1 * (2^1)= 2
2 1 1 * (2^2)= 4
3 1 1 * (2^3)= 8
C
4 0 0 * (2^4)= 0
5 0 0 * (2^5)= 0
6 1 1 * (2^6)= 64
7 1 1 * (2^7)= 128
A
8 0 0 * (2^9) = 0
9 1 1 * (2^9) = 512
10 0 0 * (2^10)= 0
11 1 1 * (2^11)= 2048
5
12 1 1 * (2^12)= 4096
13 0 0 * (2^13)= 0
14 1 1 * (2^14)= 16384
15 0 0 * (2^15)= 0
2
16 0 0 * (2^16)= 0
17 1 1 * (2^17)= 131072
18 0 0 * (2^18)= 0
19 0 0 * (2^19)= 0
8
20 0 0 * (2^20)= 0
21 0 0 * (2^21)= 0
22 0 0 * (2^22)= 0
23 1 1 * (2^23)= 8388608
F
24 0 0 * (2^24)= 0
25 1 1 * (2^25)= 33554432
26 1 1 * (2^26)= 67108864
27 1 1 * (2^27)= 134217728
E
28 1 1 * (2^28)= 268435456
29 1 1 * (2^29)= 536870912
30 1 1 * (2^30)= 1073741824
31 1 1 * (2^31)= 2147483648
4269955790
Gracias por adelantado.
Un saludo
Saludos.
El trabajo fue arduo, aunque la politica del foro es ayudar con parte del codigo y no hacerle el trabajo a la gente, lo hice para aprender.
Prueba este codigo y me dices que te parece:
String prueba= "FE 82 5A CE";
char cadena[20];
int cuenta2=0;
unsigned long valor;
void setup(){
Serial.begin(115200);
Serial.println(prueba);
String mystring = invertir(prueba);
Serial.println();
Serial.println(cadena);
Serial.println(mystring);
Serial.println();
valor=convierte(mystring);
Serial.println(valor);
mystring = invertir(mystring);
valor=convierte(mystring);
Serial.println(valor);
}
void loop(){
}
String invertir(String mensaje){
int cuenta=0;
String final="";
for(int i = (mensaje.length()-1); i >= 0; i--){ //Esta parte hace lo primero invierte el orden de los digitos
char actChar =mensaje.charAt(i);
cadena[cuenta]=actChar; //Con esta crea un arreglo de caracteres que contiene los valores
cuenta++;
if((actChar >= '0' && actChar <='9') || (actChar >= 'A' && actChar <='F')){
final+=actChar; //En esta crea un String con el valor invertido
}
}
return final;
}
unsigned long convierte(String string_mensaje){
unsigned long multiplo=1;
unsigned long total=0;
for(int i = (string_mensaje.length()-1); i >=0 ; i--){ //Esta parte hace lo primero invierte el orden de los digitos
char actChar =string_mensaje.charAt(i);
if(actChar >= '0' && actChar <='9'){
total+= ((int)actChar-'0')*multiplo;
}
else
if(actChar >= 'A' && actChar <='F'){
switch (actChar){
case 'A':
total+=10*multiplo;
break;
case 'B':
total+=11*multiplo;
break;
case 'C':
total+=12*multiplo;
break;
case 'D':
total+=13*multiplo;
break;
case 'E':
total+=14*multiplo;
break;
case 'F':
total+=15*multiplo;
break;
}
}
multiplo*=16;
}
return total;
}
Hay que tener en cuenta que no puede trabajar con cadenas mas largas de 8, si agregas un solo caracter mas no funcionara porque pasa de 32 bits.
Parece tarea del colegio o universidad, me equivoco?
Vaya max_saeta. Muchisimas gracias por tu interes y rapida respuesta.
Fijate que hay que invertir la cadena de dos en dos digitos, es decir
FE 82 5A CE: resultado invertido-----> CE 5A 82 FE --------------CORRECTO
FE 82 5A CE: resultado invertido-----> EC A5 28 EF --------------INCORRECTO
Saludos
No surbyte. Soy autodidacta con Arduino y veo que todavía me queda mucho que aprender.
Saludos
Entonces no entiendo y no por polemizar contigo.
Si tu premisa es aprender porque no adelantaste un código tuyo donde nos mostrabas hasta donde llegaste y luego gente como max o tantos otros te dabamos una mano?
De cualquier modo tal vez y eso pasa uno se propone algo y luego no sabe por donde encararlo pero lo bueno de aprender esta en equivocarse.
Muchas de las razones por las que yo intento responder todo tipo de preguntas es porque estoy aprendiendo a tener mayor conocimiento en todas las areas.
No domino todas las areas pero si las miro por fuera, tampoco lo haré. Mi mejor forma de aprender es obligarme a entender cada cosa.
Lo hago hasta que logro hacerlo funcionar y fijate, tengo 2 o 3 problemas en los que llevo semanas golpeandome y no consulto.
Aunque creo que uno de ellos ya pronto lo haré porque no le encuentro la solución y aunque se que la tengo ahi nomás, no me surge la idea.
Bien, espero que sigas aprendiendo pero la próxima toma mi consejo, y haz tu esfuerzo hasta donde puedas.
Saludos
Surbyte siempre con buenos consejos muy aplicables en este caso. Realmente el propósito de que este respondiendo a este post es que también quiero aprender, gracias a un post que respondí cuando inicie en este foro ayer pude resolver un problema planteado en al universidad. Lo que me motiva a seguir ayudando.
Pero todo debe tener equilibrio si es verdad que uno aprende, es bueno también, que planteen los avances que han realizado en sus sketch.
Bueno dicho esto, hice una modificación rápida, no creo que sea la mejor manera para resolverlo pero lo hace.
String prueba= "FE 82 5A CE";
char cadena[20];
int cuenta2=0;
unsigned long valor;
void setup(){
Serial.begin(115200);
Serial.println(prueba);
String mystring = invertir(prueba);
Serial.println();
Serial.println(mystring);
Serial.println();
valor=convierte(mystring);
Serial.println(valor);
mystring = invertir(mystring);
valor=convierte(mystring);
Serial.println(valor);
}
void loop(){
}
String invertir(String mensaje){
int cuenta=0;
String final="";
String real="";
for(int i = (mensaje.length()-1); i >= 0; i--){ //Esta parte hace lo primero invierte el orden de los digitos
char actChar =mensaje.charAt(i);
cadena[cuenta]=actChar; //Con esta crea un arreglo de caracteres que contiene los valores
cuenta++;
if((actChar >= '0' && actChar <='9') || (actChar >= 'A' && actChar <='F')){
final+=actChar; //En esta crea un String con el valor invertido
}
}
real+=final.charAt(1);
real+=final.charAt(0);
real+=final.charAt(3);
real+=final.charAt(2);
real+=final.charAt(5);
real+=final.charAt(4);
real+=final.charAt(7);
real+=final.charAt(6);
return real;
}
unsigned long convierte(String string_mensaje){
unsigned long multiplo=1;
unsigned long total=0;
for(int i = (string_mensaje.length()-1); i >=0 ; i--){ //Esta parte hace lo primero invierte el orden de los digitos
char actChar =string_mensaje.charAt(i);
if(actChar >= '0' && actChar <='9'){
total+= ((int)actChar-'0')*multiplo;
}
else
if(actChar >= 'A' && actChar <='F'){
switch (actChar){
case 'A':
total+=10*multiplo;
break;
case 'B':
total+=11*multiplo;
break;
case 'C':
total+=12*multiplo;
break;
case 'D':
total+=13*multiplo;
break;
case 'E':
total+=14*multiplo;
break;
case 'F':
total+=15*multiplo;
break;
}
}
multiplo*=16;
}
return total;
}
Se que teneis toda la razon, pero no sabia ni siquiera por donde empezar, je, je...
Bueno, no pasa nada Carl0701, para la próxima y sabemos que siempre hay una próxima, intenta dar tu mejor esfuerzo. Solo eso.
Ahhh y ya que eres nueva (creo que eres mujer), recuerda siempre presentar el problema de la maneara que lo hiciste. Bien detallado, y si tienes codigo lo subes, y si tienes librerías que te dan problemas pones el link.
Todo eso ahorra tiempo a los que del otro lado intentamos ayudar.
Gracias