zairillo, creo que tu problema radica en que no sabes cómo utilizar
atof(). Esta función convierte una cadena de caracteres en un flotante, pero tal que
se convierte en
float cadena_convertida = 123.45
pero si nos fijamos en los valores REALES de
char *cadena, verás que (puedes usar un depurador para comprobarlo):
cadena[0]=49
cadena[1]=50
cadena[2]=51
cadena[3]=46
cadena[4]=52
cadena[5]=53
es decir, son los códigos ASCII y no los números reales (el valor real en memoria) lo que convierte
atof(). Evidentemente, si los códigos ASCII no son de números, te devolverá 0 (que es tu caso).
Además, como ya te dice Eternal Idol,
unsigned char no tiene sentido, es lo mismo que
char (lo puedes consultar donde quieras). Los caracteres no llevan signo, sino un código que los representa como puedes comprobar.