Asi es rivale, es exactamente lo que hago, pero no lo convierte :shock:
char BufferRX[4]; //arreglo de 16 bytes
char DataTX[4]; //arreglo de 16 bytes
int i;
int pos = 0;
char comando;
unsigned int RX_data;
int ang;
int pwm;
char PWM[3];
char ANG[3];
//recepcion de comandos
unsigned int check_command_serial()
{
if (DataRdyUART1())
{
RX_data = ReadUART1();
switch (RX_data)
{
case 10 : break;
case 13 : if (pos>0)
{
comando = BufferRX[0];
pos = 0;
ANG[0] = BufferRX[1];
ANG[1] = 0;
PWM[0] = BufferRX[2];
PWM[1] = 0;
ang = atoi(ANG);
pwm = atoi(PWM);
pos = 0;
BufferRX[pos] = 0;
PWM[pos] = 0;
ANG[pos] = 0;
return 1;
}
break;
default :
BufferRX[pos] = RX_data;
pos++;
BufferRX[pos] = 0;
break;
}
}
return 0;
}
Hola paisano.
Creo que estan haciendo las cosas mal, las funciones atoi, atol y demas se ejecutan con "caracteres numericos" es decir ASCII, aqui veo que estan usando hexadecimal y por alli no va bien la cosa.
Para que te haces problemas si el valor esperado va de 0x00 a 0x0F entonces calcula directamente:
por ejemplo si escribo(o envío) 'A8F', voy a mandar girar a la izquierda(caracter A) 200°(caracter 8) y a un pwm del 100%(el caracter F)
Si escribo 'BF7' B:derecha, F:360° y 7:50% pwm y así de la misma manera para otros caracteres hexadecimales.
rivale, en realidad envio varios bytes, algo como 'AFC', luego desgloso cada byte interpretandolo como hexadecimal(o sea no se enviará valores que no signifiquen hex, como una secuencia: 1HT), a excepcion del primero(A) que solo lo uso como comando y represento su valor decimal, por ejemplo: C es 12...por lo que me dices, la mejor opcion sera restar 0x30 para los bytes de base 10 pero para los bytes:A, B, C, D, E Y F supongo que restare 0x31 :lol: