Autor Tema: Convertir Array en Cadena  (Leído 2070 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Ric555

  • PIC10
  • *
  • Mensajes: 37
Convertir Array en Cadena
« en: 26 de Febrero de 2005, 04:03:00 »
Hola a todos/as

Desearía saber si se puede hacer de otra forma lo siguiente.

Tengo un array que tiene un Codigo ASCII en binario es decir.

b[0] = 1;
b[1] = 0;
.
.
.
b[7] = 0;

para enviarlo via RS232 lo que hago es convertirlo a decimal haciendo


void BinADeci(){
ch = 1*b[7] + 2*b[6] + 4*b[5] + 8*b[4] + 16*b[3] + 32*b[2] + 64*b[1] + 128*b[0] ;
}

y luego hago un put c(ch)


Mi pregunta es hay alguna otra forma de enviar el codigo binario anterior via Serial sin pasar por la conversión BinADeci. Es que en la conversión me consumen muchas instrucciones y pierdo caracteres.


Muchas gracias

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: Convertir Array en Cadena
« Respuesta #1 en: 26 de Febrero de 2005, 05:39:00 »
Hola,

es necesario guardar el dato en un array de 7 elementos?? puedes guardarlo en un byte formado ya, para que a la hora de sacarlo no tengas k perder el tiempo en la conversion? por la razon que sea imagino k no Flash

Normalmente en los micros la operacion "multiplicacion" suelen ser lenta, y conviene utilizar otra, como por ejemplo el desplazamiento.  Debes consultar las intrucciones de tu micro y sus tiempos de ejecucion para ver que es mas rapido.

Podria probar a poner la conversion asi:

ch = (b[0]<<7) | (b[1]<<6) | (b[2]<<5) | (b[3]<<4) | (b[4]<<3) | (b[5]<<2) | (b[6]<<1)  | (b[7]);

He utilizado una OR en lugar de sumar por que estamos seguros de que los bits no se solapan. Consulta tb si es mas rapida la operacion ADD o la OR en tu micro.

Por ultimo, yo pondria esa funcion como inline, para evitar el salto a esa funcion con la consecuente perdida de tiempo. Ocuparia mas espacio, ya que la pegaria en el codigo enterica cada vez que la llames tu en lugar de hacer una llamada, pero ganarias velocidad.

Ahora si por ultimo, si puedes consulta el ensamblador creado (depende del compilador sera bueno o no), y si no lo ves muy optimo, podrias hacer esa funcion en ensamblador.

Un saludo.

Desconectado Ric555

  • PIC10
  • *
  • Mensajes: 37
RE: Convertir Array en Cadena
« Respuesta #2 en: 26 de Febrero de 2005, 06:34:00 »
Muchas gracias damago por la explicación.

Realmente lo que estoy haciendo es capturar lo que envía Irda Una PDA. Una vez que he detectado el StarBit, voy guardando cada uno de los 8 bit del carácter ASCII en cada elemento del Array. He usado un array porque no se hacerlo de otra forma.

Lo de poner esa funcion inline, como se hace??.

Muchas gracias

Desconectado Ric555

  • PIC10
  • *
  • Mensajes: 37
RE: Convertir Array en Cadena
« Respuesta #3 en: 26 de Febrero de 2005, 06:54:00 »
Se me había olvidado poner que también he usado  la siguiente forma,

shift_right(&ch, 1, b[7]);
shift_right(&ch, 1, b[6]);
shift_right(&ch, 1, b[5]);
shift_right(&ch, 1, b[4]);
shift_right(&ch, 1, b[3]);
shift_right(&ch, 1, b[2]);
shift_right(&ch, 1, b[1]);
shift_right(&ch, 1, b[0]);

donde ch es de tipo carácter

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: Convertir Array en Cadena
« Respuesta #4 en: 26 de Febrero de 2005, 08:37:00 »
Hola, un preguntita...porque haces manual la recepcion , en lugar de utilizar el puerto serie??

la forma de poner inline depende de cada compilador....tendras que mirar el manual de tu compilador de C:

sera algo asi:

inline void BinADeci(){ ...........blablalb

No se como funciona la funcion "shift_right" qe utilizas. Imagino que pondra el b en el bit de mayor peso y desplaza a la derecha el byte???? nose. En todo caso vendra a ser lo mismo que te puestop yo antes no?.

Ahora mismo si no encuentras lo de inline (pero seguro que aqui lo sabra mucha gente que utilizara tu compilador), puedes poner el codigo ese directamente sin llamar a esa funcion.

Aunque no sea una solucion, yo de todos modos guardaria los datos de entrada en un byte directamente no en un array.. Por ej. asi:

//Primero recibes el bit de start.
// Ahora un bucle leyendo los 8 bits.
dato=0;
for(i=0;i<8;i++)
{
  if(PIN_RXD) dato |=1; // Es lo mismo que dato = dato | 1;
  dato <<=1; // Es lo mismo que dato = dato<<1;
  delay(TIEMPO_PROXIMO_BIT);
}

Asi cada vez que entra un bit lo pone en el bit de menro peso de dato y lo desplaza a la izquierda. Al final tndras lso 8 bits colocados en el byte. El primero que llegue acabara en el bit de mayor peso de "dato" y el ultimo en el de menor peso.

Luego para sacarlo, no tienes k hacer ninguna converison. Sacas directamente "dato".

De todos modos la mejor manera es utilizar el puerto serie para leer tb. Es un problema de velocidad de comunicacion el no usarlo??

Un saludo.

Desconectado Ric555

  • PIC10
  • *
  • Mensajes: 37
RE: Convertir Array en Cadena
« Respuesta #5 en: 27 de Febrero de 2005, 13:09:00 »
Hola Damago, El compilador que uso es el PCW.

Lo de hacer manual la recepción es porque lo que va a recibir son bytes en formato Irda y nose si usando el estándar Rs-232 funcionaría, ya que varía en la forma de recibir.

La verdad es que no he probado a usar los comandos que tiene el compilador PCW para el manejo del Rs-232 donde la entrada sea el detector IRDA.


Aún así ya he conseguido con las indicaciones que me diste, que recibiera datos por el detector y luego los enviara por Rs-232 al PC.

Ahora sólo me queda Recibir Rs-232 y enviarlos IRDA.