Muchas gracias por sus respuestas. He resolvido el problema de una forma bastante obvia pero que paso desapercibida en mi hasta que escuche sus opiniones. Yo poseia una funcion construida por mi(muy similar en sus conceptos a atol, pero modificada a mis necesidades) que permitia convertir strings a variables de 16 bits y que me devolvia un 1 cuando ocurria un error durante la conversión, o un cero si la conversion fue satisfactoria. El problema era que la funcion siempre convertia la cadena en numero sin importar si estaba desbordada o no.
Mi forma de solucionar el problema fue muy simple, volver a convertir ese numero en string con la funcion sprintf y compararla con la recibida por el puerto UART, y si cualquier numero era distinto al original se produce un error y la funcion no retorna nada.
El resultado es una funcion para convertir cadenas a numeros con deteccion de desbordamiento y en la que ademas no necesite utilizar ninguna variable extra para realizarla, yo tan quisquilloso con ese tema.
No se si sera tan rapida o tan eficiente como pasar la variable de 16 bits a una de 32 pero es una solucion elegante a mis problemas en particular y que ademas se puede utilizar con cualquier tipo de variable, hasta de 32 bits. Aqui esta la funcion, bastante descolgada pero su uso es general asi que sirve para cualquier programa. La unica variable global es Cadena, que la tenia disponible y que la uso para operaciones temporales, pero puede reemplazarse por una variable local sin ningun tipo de problema.
short Texto_a_Numero(long *Variable, char *Texto)
{
long Resultado = 0; // Resultado temporal de la conversión.
Int Posicion = 0; // Posición del caracter dentro de la cadena de texto.
Char Caracter; // Caracter que se esta convirtiendo.
int i = 0;
for(i = 0; i<6; i++){ // Borro la variable Cadena, que es global y que la tengo disponible.
Cadena[i] = '\0';
}
Caracter = Texto[Posicion++];
if (Caracter=='\0'){return 1;}; // Si la cadena es nula la funcion termina y
// devuelve el valor 1.
while (Caracter!='\0'){
if (Caracter >= '0' && Caracter <= '9'){ // Genera un bucle que convierte secuencialmente todos los caracteres de
Resultado = 10*Resultado + (Caracter - '0'); // la cadena.
Caracter = Texto[Posicion++]; // Se pasa al siguiente caracter.
}
else{return 1;} // Si el caracter que se esta analizando no es numerico la función retorna el
} //valor uno.
sprintf(Cadena,"%lu",Resultado); // Convierte el numero a string otra vez.
if (!Comparar_Cadena(Cadena,Texto,strlen(Texto))){ // Comparar_cadena es muy similar a strncmp.
return 1;
} // Si el caracter que se esta analizando no es numerico la función retorna el
// valor uno.
*Variable = Resultado; // La variable definida como parametro almacena el valor convertido.
return(0); // La función retorna el valor cero indicando que no hubo error durante la
// conversion.
}
Perdon por la tabulacion del programa, lo pegue bastante mal. Saludos.