Autor Tema: Problema envío byte no-ASCII por RS232  (Leído 3888 veces)

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

Desconectado Arvydas

  • PIC10
  • *
  • Mensajes: 8
Problema envío byte no-ASCII por RS232
« en: 15 de Mayo de 2008, 09:19:58 »
Bueno, el caso es que la comunicación entre PC y PIC funciona perfectamente, pero falla lo siguiente: el PIC trata de enviar bytes que tienen el bit 7 a 1, es decir, sin representación ASCII, y el PC no los recibe. No sé por qué puede ser ni qué hacer para solucionarlo. El byte que viaje por el BUS RS232 debe ser obligatoriamente el que se trata de enviar por el programa.

Por favor, ayuda!!

Código: [Seleccionar]
#include "C:\Program Files\PICC\Projects\Pregunta\pregunta.h"



boolean esMiAdress(char pregunta,int adress){
   int i,n=0;
   boolean es_mi_adress=true;
   for(i=2;i<=6;i++){
      if(bit_test(pregunta,i)!=bit_test(adress,n)){
         es_mi_adress=false;
      }
      n++;
   }
   return es_mi_adress;
}
void main()
{
   int adress=0b00011111;
   byte pregunta,respuesta;
   boolean hayTarjeta=1,tipoUsuario=1;
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(GLOBAL);
   
   // TRIS CONFIG (Ini)
   set_tris_b(0b00000001);
   
   //Pregunta
   pregunta=getc();
   
   port_b=0b00000010;
   
   if(bit_test(pregunta,7)==0 && esMiAdress(pregunta,adress)){
      port_b=0b00000000;
      if(hayTarjeta){
         if(tipoUsuario){ //tipoUsuario=1->h, tipoUsuario=0->e
            respuesta=0b11100000;
         }
         else{
            respuesta=0b11000000;
         }
      }
      else{
         respuesta=0b10000000;
      }
      printf("La respuesta es: %c",respuesta);
   }
}

Si pongo printf("%u",respuesta); , recibo 00110010 en el PC, es decir, el codigo ascii del número 2. Debería recibir 11100000 :S.
« Última modificación: 15 de Mayo de 2008, 11:09:45 por Arvydas »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema envío byte no-ASCII por RS232
« Respuesta #1 en: 15 de Mayo de 2008, 12:56:09 »
Arvydas qué usas del lado del PC para corroborar que no te llega nada?
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Arvydas

  • PIC10
  • *
  • Mensajes: 8
Re: Problema envío byte no-ASCII por RS232
« Respuesta #2 en: 15 de Mayo de 2008, 12:58:20 »
Arvydas qué usas del lado del PC para corroborar que no te llega nada?

Uso un programa de java que usa la librería javax.comm. También para asegurarme de que no es problema de este programa, uso un programa de C que se comunica por el puerto de serie.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema envío byte no-ASCII por RS232
« Respuesta #3 en: 15 de Mayo de 2008, 13:14:17 »
Mira, no se que esperas recibir pero según entiendo, la parte relevante del código será


respuesta=0b11100000;
printf("La respuesta es: %c",respuesta);


Desmenuzando,

respuesta = 11100000bin = E0 hex = 224 dec.

Si usas printf, te está convirtiendo el número respuesta a ascii, por ende envío un 2 y no le has dado tiempo a que envíe el resto o el software terminó abruptamente antes porque no veo ningún while ni nada.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problema envío byte no-ASCII por RS232
« Respuesta #4 en: 15 de Mayo de 2008, 13:23:38 »
Saludos!
Yo uso este programita, es viejito pero funciona de lo lindo:
TeraTermPro
Sólo tienes que darle setup...serial port y le colocas la configuración deseada (baudios, bit de parada, etc) y listo!  :)
Ahí lo tienes por si deseas probarlo...
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Arvydas

  • PIC10
  • *
  • Mensajes: 8
Re: Problema envío byte no-ASCII por RS232
« Respuesta #5 en: 15 de Mayo de 2008, 13:56:55 »
Mira, no se que esperas recibir pero según entiendo, la parte relevante del código será


respuesta=0b11100000;
printf("La respuesta es: %c",respuesta);


Desmenuzando,

respuesta = 11100000bin = E0 hex = 224 dec.

Si usas printf, te está convirtiendo el número respuesta a ascii, por ende envío un 2 y no le has dado tiempo a que envíe el resto o el software terminó abruptamente antes porque no veo ningún while ni nada.



Ahí está el problema, que no quiero que lo transforme a ascii ni nada, quiero que envíe exactamente ese byte: 11100000. Además cuando pongo la máscara %c el resultado es que no se recibe ese último byte, pero sí se recibe "la respuesta es: " (veo tanto los carácteres como los bytes en el PC de escucha, por lo tanto también vería bytes sin representación ASCII), y creo que no lo envía porque 224 no tiene representación ASCII.
 No se de qué forma tengo que escribir el printf para que envíe exactamente eso, o qué máscara de formato tengo que usar (%c, &x, %u...) para que no sufra cambios. La razón es que estoy desarrollando un sistema con más de un PIC en un BUS RS232 el cual está conectado a un ordenador, y se debe seguir un protocolo a rajatabla para que no haya problemas.
« Última modificación: 15 de Mayo de 2008, 14:02:49 por Arvydas »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema envío byte no-ASCII por RS232
« Respuesta #6 en: 15 de Mayo de 2008, 15:58:56 »
Ahí está el problema, que no quiero que lo transforme a ascii ni nada, quiero que envíe exactamente ese byte: 11100000. Además cuando pongo la máscara %c el resultado es que no se recibe ese último byte, pero sí se recibe "la respuesta es: " (veo tanto los carácteres como los bytes en el PC de escucha, por lo tanto también vería bytes sin representación ASCII), y creo que no lo envía porque 224 no tiene representación ASCII.
Pero tu código termina allí? Poruqe si termina allí le veo que le falta un bucle infinito que permita al pic seguir funcionando.
Tal vez tu problema esté en que le debas indicar al compilador cuantos caracteres debe contener el número para que te ponga 224 (en ascii).



No se de qué forma tengo que escribir el printf para que envíe exactamente eso, o qué máscara de formato tengo que usar (%c, &x, %u...) para que no sufra cambios. La razón es que estoy desarrollando un sistema con más de un PIC en un BUS RS232 el cual está conectado a un ordenador, y se debe seguir un protocolo a rajatabla para que no haya problemas.

Bien queda claro que tu quieres enviar el byte 224, sin importar que representación tenga en pantalla.  Para eso simplemente usa un putc(respuesta) y listo. ;)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Arvydas

  • PIC10
  • *
  • Mensajes: 8
Re: Problema envío byte no-ASCII por RS232
« Respuesta #7 en: 16 de Mayo de 2008, 07:05:44 »
maunix muchas gracias, no logro entenderlo pero el poner un while(true) ha surtido efecto!!!

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema envío byte no-ASCII por RS232
« Respuesta #8 en: 16 de Mayo de 2008, 08:50:03 »
maunix muchas gracias, no logro entenderlo pero el poner un while(true) ha surtido efecto!!!

Si no lo entiendes, acá estamos para ayudarte a entender.  Tu has demostrado esfuerzo e interés en resolver el problema, y en esos casos te aseguro que encontraras en este foro gente dispuesta a echarte una mano!

Piensa de la siguiente forma.

El main no diferente a cualquier otra función, empieza y termina.  Y cuando termina... a donde va? qué hace? Bueno, esto depende del compilador.  Algunos envían al código de nuevo a reiniciarse, otros lo dejan ahi parado, lo mandan al micro a un sleep, etc.

Imaginate que tuvieras


void main(void)
{
   ...
   ...
}

sleep


Siendo el sleep una instrucción que estará en memoria de programa, no visible para el programador sino que se compilará justo debajo de la última instrucción del bucle main.  Lo mismo puede ser si el micro hace un reseteo o similar (esto es solo para los 18F y superiores).

Entonces la usart tiene tamaño para un par de bytes.  Uno en el TXREG y otro en el registro de transmisión TSR.  Entonces, en esa parte el código quiere enviar.  Cambiaré el número para hacer gráfico el ejemplo y que no te marees con tantos 2.

Ej. respuesta = 234.

1. El micro tiene el TXREG = "2" y el TSR = " "   
   (esto es porque el contenido del TXREG pasa al TSR cuando éste se vacía, es el TSR el que irá sacando sus bits por el pin)

2. Se transmitió correctamente el espacio y ahora tenemos:
   TXREG = "3" y el TSR = "2".   

3. Se transmitió correctamente el "2" ahora tenemos
    TXREG = "4" y el TSR = "3"

4. Se transmitió correctamente el "3" ahora tenemos
    TXREG = <vacío> y el TSR = "4"

En tu caso, ni bien comienza la secuencia 3, el micro se va a dormir, se resetea o lo que sea.  Por eso si le pones un while() que evite que se resetee o vaya a dormir, tu dato se transmite correctamente!   

Espero haber sido claro  :) :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)