Go Down

Topic: Seleccionar trozos de una cadena de caracteres (Read 3367 times) previous topic - next topic

noxasdj

Buenas compañeros,

Tengo un problema "en principio" basico pero no se como resolverlo.

Desde el Serial.Read() me llega una cadena de carateres como esta: B234

Me gustaria saber como destriar la B por una parte i el 234 por otra.

Espero que alguien me pueda ayudar :)

Muchas gracias



noxasdj

perdoname, pero no soy un experto en sistemas binarios y hexadecimales. Me he perdido complertamente con tu post. :smiley-red:

Pofenas

En absoluto puede hacer enmascaramiento. Se trata de una cadena de caracteres, no un valor entero. Ademas, no es multiplicando como se hace, sino mediante los operadores logicos bit a bit. Por otra parte, lo que el compañero quiere es quedarse con una parte de la cedena, no que tomen valor cero.
Creo que la solucion pasa por estudiar las funciones de strings que puedes encontrar aqui:
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html
Aqui tienes unas cuantas funciones para el manejo de cadenas de caracteres, pero te prevengo: no es trivial el modo en que en C se manejan los strings, y suelen ser un mareo para los programadores que viene de otros lenguajes. Mi sugerencia es que te tomes un poco de tiempo para estudiar en algun manual como se manipulan las cadenas en C antes de empezar con el metodo ensayo-error.

Humphrey

Buenas

Creo que esto te puede servir, no lo entiendo muy bien pero funciona. Lo utilizo para leer datos desde el puerto serie desde en processing.

Mando esto desde el arduino:

    Serial.print("X");
    Serial.print(leftRightPos);
    Serial.print("V");
    Serial.println(average);

Y lo leo desde processing:

void serialEvent (Serial myPort) {
  String xString = myPort.readStringUntil('\n');  // read the serial port until a new line
    if (xString != null) {  // if theres data in between the new lines
        xString = trim(xString); // get rid of any whitespace just in case
        String getX = xString.substring(1, xString.indexOf("V")); // get the value of the servo position; creo que lo que hace es coger la parte del string hasta V
        String getV = xString.substring(xString.indexOf("V")+1, xString.length()); // get the value of the sensor reading; aquí lo que hace es coger a partir de V
        degree = Integer.parseInt(getX); // set the values to variables;
        value = Integer.parseInt(getV);
}

Espero que te sirva,

Me imagino que si sabes como va a ser tu string y con el ejemplo anterior puedes hacer un substring para el primer valor y otro para el dato que te interesa y luego pasarlos a char y a int. Es solo una idea (soy nuevo en esto así que no me hagas mucho caso).

curro92

Hola,
Si tu cadena consiste siempre de primera parte compuesta de letras y una segunda parte compuesta de dígitos, podrías hacer algo así
Code: [Select]

char *p, a[9], b[9], cadena[] = "B234";
int n;

p = &cadena[0];
n = 0;
while(isalpha(*p))
   a[n++] = *p++;
a[n] = '\0';

n = 0;
while(isdigit(*p))
   b[n++] = *p++;
b[n] = '\0';



noxasdj

Buenas a todos, problema resuelto. Muchas gracias por vuestras aportaciones. El problema residia en que desde processing solo se pueden enviar data tipo byte y no string. Cuando descubrí eso, resolvi el problema. Muchas gracias por vuestras aportaciones. Estoy muy contento!

Gentec

hola noxasdj quiciera pedir tu colaboracion con algo muy similar a lo que te pasaba ya que soy nuevo en esto no tengo idea de como solucionarlo.
Lo que hago es enviar el comando ( a un modem)

AT$MDMID? El modem me responde:

$MDMID: "AAA001"
OK

Necesito tomar solo el dato AAA001.

Agradezco tu colaboración

Go Up