# [ERROR] envío de datos PIC -  PC Serial [max 32  ]  Hyperterminal



## kamk (Oct 1, 2014)

Buenos Días,

Para decirlo simple - estoy enviado números desde el pic al computador, para ver la información uso el Hyperterminal pero al final lo unico que recibo son simbolos y de repente uno que otro numero... pero nada coHerente. (como se muestra1 en la imagen adjunta)

Las pruebas practicas fueron las siguientes:

-Usando el modulo blutootH ( HC-06/ HC-05) funciona el envió de datos, entonces:

-empece a probarlo de forma cableada con un modulo usb-ttl conectado directamente del pic al pc, y probando el Hyperteminal para ver los datos, me di cuenta que solo recibía símbolos.

Pensé entonces que era problema del usb, e implemente  un circuito  con el MAX32 y un cable usb-serial para conectar el pic con el computador, y revisando el Hyperterminal, obtuve los mismos resultados (simbolos y simbolos puntos comillas, signos etc).

Entonces, ¿qué procedimiento seguir para lograr visualizar la información en el Hypertermina?



Este el que uso para enviar los datos del pic al pc por transmisión serial.


```
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#include <stdlib.h>
#use delay(clock=4M)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

void main(){
int d=0;
while(1){
d++;
printf("%d\r\n",d);
delay_ms(1000);
}
}
```


Este es un codigo más complejo que pille por internet, ya que la intención final es graficarlo en exel, para ello los datos son capturados en el Hyperterminal, pero solo recibo simbolos como mencione anteriormente, 


```
#include <16f877a.h>
#include <stdlib.h>
#use delay(clock=4M)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#fuses XT,NOWDT,NOPROTECT,NOLVP
//#define LCD_DATA_PORT getenv("SFR:PORTD")
//#include <lcd.c>
#byte pa=0x05
#byte pb=0x06
#byte pc=0x07
#byte pd=0x08
void main() {
      set_tris_a (0);
       
       set_tris_c (0xB8);
       pa=0;
       pb=0;
       

//lcd_init();
unsigned int8 valor,p=0;

setup_adc_ports(AN0_AN1_AN3);     //indica cuales canales del micro se usaran cmoom conversores adc
setup_adc(ADC_CLOCK_INTERNAL);
//set_adc_channel(0);
printf("Tiempo");
putc(0x3B);//envia punto y coma
printf("Tension\r");     //indica que el muestro de datos se realiza segun la velocidad interna del micro
//lcd_putc("\fReady...\n");
while(1) {
         set_adc_channel(0);  
         delay_us(20);
         valor=read_adc();
         
          printf("%d",p++);//p se incrementa cada un segundo y se envia por usart
          putc(0x3B);
          printf("%u\r",valor);//q contiene el valor del convertidor ana / dig
          delay_ms(1000);
         
}
}
```




Si alguno pudiera ayudarme,


----------



## Melghost (Oct 1, 2014)

¿Entiendo que pretendes enviar bytes de cualquier valor, y que el Hyperterminal te haga automáticamente la conversión a los caracteres necesarios para mostrar su valor en decimal?

Es decir, si le envias un byte con el valor 32, por ejemplo, no vas a ver "32" en la pantalla, sino un espacio, que es el caracter que corresponde al código ASCII 32. Lo mismo con el resto de los códigos. Sólo verás números cuando envíes valores entre el 48 y el 57 (códigos ASCII de los números 0 al 9)

Si estás utilizando el Hyperterminal sólo para pruebas antes de realizar una aplicación definitiva, quizás estés haciéndolo bien y creas que no.


----------



## kamk (Oct 1, 2014)

|: si, bueno aun recibo simbolos, lo probe con el modulo blutoot y funciona,  el profesor me dijo que probablemente era el cable o la configuración de baudios era muy alta (9600) así que probe de varias formas posibles, con 2400, cambiamos el cable y conector, pero aun persiste el problema,


seguire testeando, pero gracias Melghost,  será que se presente alguien haya tenido el mismo percanse.


----------



## amistoso (Oct 15, 2014)

En la imagen se ve que si hay comunicación entre el pic y el hyperterminal. Creo que el problema es que no tienes handshaking (control de flujo) al transmitir tus datos. También podrías enviar caracteres ASCII 
Binario	        Dec	Hex	Representación
0100 0001   	65	41	A
0100 0010	        66	42	B
y en hyperterminal se debe de mostrar las letras equivalentes.


----------



## ViCtorA (Oct 16, 2014)

Estoy de acuerdo con amistoso, el control de flujo con el modulo  Bluetooth lo realiza el mismo (finalización de bit/byte enviado, etc) por eso te funciona. Mira estos ejemplos de rutinas para que lo veas; 


```
void R_UART0_putc_RS(unsigned char dato)
{
 unsigned char vl_uc_dato[2];

 vl_uc_dato[0]=vl_uc_dato[1]=dato;

 g_Uart0TxEnd = R_UART0_Send(vl_uc_dato, 1);  // pone dato a transmitir
 while(g_Uart0TxEnd == 0){}		                   // Espera que acabe de transmitir
}

/*******************************************************************************
* Function Name: R_UART0_puts_RS
* Description  : saca string rs232 hasta que encuentra valor 0
* Argument     : uint8_t* vl_uc_cadena character string.
* Return value : none
*******************************************************************************/

void R_UART0_puts_RS(unsigned char *vl_uc_cadena)
{
 volatile unsigned char vl_uc_nbyte, vl_uc_dato;
 unsigned int n_bytes;

 for(vl_uc_nbyte=0;vl_uc_nbyte<60;vl_uc_nbyte++)      // maximo 60 caracteres
  {
   vl_uc_dato=vl_uc_cadena[vl_uc_nbyte];
   if(vl_uc_dato==0 )    break;
  }

 n_bytes=(unsigned int)vl_uc_nbyte;

 g_Uart0TxEnd = R_UART0_Send(vl_uc_cadena, n_bytes);  // pone datos a transmitir
 while(g_Uart0TxEnd == 0){}		                        // Espera que acabe de transmitir
}
```

Convierte caracter en Hexadecimal 1 byte:

```
void R_UART0_print_hex_RS2(unsigned char vl_uc_dato){    // RS232 en hex 
 unsigned char vl_uc_xx[3];
 vl_uc_xx[0]=vl_uc_dato>>4;
 vl_uc_xx[1]=vl_uc_dato&0x0f;

 vl_uc_xx[0] = (vl_uc_xx[0] < 0x0A) ? (vl_uc_xx[0]+0x30):(vl_uc_xx[0]+0x37);
 vl_uc_xx[1] = (vl_uc_xx[1] < 0x0A) ? (vl_uc_xx[1]+0x30):(vl_uc_xx[1]+0x37);

 g_Uart0TxEnd=R_UART0_Send(vl_uc_xx,2);  // pone datos a transmitir
 while(g_Uart0TxEnd==0);	                    // Espera que acabe de transmitir
}
```

Aparte del hiperterminal, hay otros programas que te muestran la información recibida en ASCII, HRX, decimal y binario. uno  de ellos es " Docklight "


----------



## martin12as (Oct 16, 2014)

yo creo que lo que pasa es que estas enviando variables INT, y el hypertermial las muestra como ascii, podrías usar Realterm que te permite configurar como mostrar los datos recibidos.

otro posible error es que no tengas bien configurado el cristal..

igual hace 2 semanas que no responde el autor del tema, por lo que supongo que ya soluciono el problema y se olvido de avisar


----------

