Saludos
Soy nuevo por aquí y también soy un poco curioso, la cadena de caracteres son datos enteros separados por comas? Es decir no seria mas fácil en vez de tomar carácter por carácter luego de f, tomar los datos separados por las comas? Como usaras los datos obtenidos?
Este primer codigo hace lo que pides
/*Convierte cadena String en caracteres CHAR
Por Newlin Max Saeta. 08/08/2014
Este Sketch es ejemplo de como recibir una cadena de
caracteres y convertirla en una arreglo char.
Todas las comas se ignoran y se toman cualquier valor distinto
hasta recibir el un 13 (0x0d) y luego lo imprime para reiniciar la
recepcion
*/
#define VERSION "RECIBIR"
String variable= "";
char caracter[200]; //Cambiar este valor para aumentar o disminuir los caracteres a convertir
int contador;
void setup(){
Serial.begin(115200);
Serial.println(VERSION);
}
void loop(){
if(Serial.available()){
char lectura = Serial.read();
if (lectura == 13){
//Serial.println(variable);
convierte();
}
else {
if(lectura!= ','){variable+=lectura;} // Ignora las comas recibidas
//variable+=lectura; // Si desea guardar también las comas
}
}
}
void convierte(){
for(int i= 0; i < variable.length(); i++){
caracter[i]= variable.charAt(i);
Serial.print(caracter[i]);
Serial.print(",");
}
variable = "";
Serial.println();
}
Este código recibe la cadena y convierte cada valor numérico separado por comas en un LONG.
/*Convierte cadena de caracteres en variables LONG.
Por Newlin Max Saeta. 08/08/2014
Este Sketch es ejemplo de como recibir una cadena de
caracteres iniciando con el comando "f" y terminando
con un retorno de carro (0x0d).
Ejemplo:
f0,0,0,0,0,0,0,0,0,0,0,0,0514,0525,0496,0514,0495,0493,0507,0508,0515,0503,0506,0497,0498,0505,0,0,0,0,0,0,0
Cada valor a convertir debe finalizar con una coma ','
lo que indicara el inicio de la otra variable
Al final imprime los valores recibidos en la cadena y su valor en LONG
*/
#define VERSION "Convierte cadena de caracteres en Long V0.1"
String variable= "";
const int cantidad= 40; //Cantidad de variables a recibir
int contador;
String str_valor[cantidad];
long lng_valor[cantidad];
boolean iniciado= false;
unsigned long tiempo= millis();
void setup(){
Serial.begin(115200);
Serial.println(VERSION);
}
void loop(){
if(Serial.available()>0){
char lectura = Serial.read();
// Serial.println(lectura);
switch (iniciado){
case false:
if (lectura == 'f'){
iniciado = true;
}
break;
case true:
switch (lectura){
case 13:
iniciado = false;
for(int i = 0 ; i < contador; i++){
}
convertir_long();
contador=0;
break;
case ',':
contador++;
break;
default:
if (lectura >= 0x30 && lectura <= 0x39){
str_valor[contador]+= lectura;
}
}
break;
}
}
}
void convertir_long(){
for (int m=0; m<contador; m++){
if (contador > cantidad){return;}
Serial.print("Cadena: ");
int largo = (str_valor[m].length());
if (largo < 4) {Serial.print(" ");}
if (largo < 3) {Serial.print(" ");}
if (largo < 2) {Serial.print(" ");}
Serial.print(str_valor[m]); //Imprime cada cadena contenida entre comas
str_valor[m].concat(0);
char buf[str_valor[m].length()];
str_valor[m].toCharArray(buf,str_valor[m].length());
lng_valor[m]=atof(buf);
Serial.print("\t\tValor numerico Long: ");
if (lng_valor[m] < 100000) {Serial.print(" ");}
if (lng_valor[m] < 10000) {Serial.print(" ");}
if (lng_valor[m] < 1000) {Serial.print(" ");}
if (lng_valor[m] < 100) {Serial.print(" ");}
if (lng_valor[m] < 10) {Serial.print(" ");}
Serial.println(lng_valor[m]); //Imprime el valor LONG
}
}