hola amigos, gracias a todos por estar ayudandome..
quiero comentarles, que esto de leer la trama ha sido un lio cada vez se complica mas, provee el programa que han ayudado a corregir y funciona perfecto en el simulador pero en lo fisico no...
la idea principal es leer los datos de un computador, mi pregunta es , se podrá hacer un programa solo para identificar que es realmente lo que esta enviando y con que frecuencia, como no tengo el computador..trate simular con un Microcontrolador como si fuera el computador que estuviese mandando los datos..pero creo que no sera lo mismo..
mi idea es elaborar un programa en donde lea los datos del pc, y los muestre por un lcd 16x2....asi puedo ver realmente que es lo que esta enviando
pero supuestamente los datos que se envian son datos decimales del 0 al 99...
no se si estan saliendo, hay varias alternativas creo:
datos importantes 9600 baudios
alternativa 1 : 1A&1B = hexadecimal & hexadecimal
alternativa 2 : 1A1B = hexadecimal, hexadecimal
alternativa 3 : 2627 = binario,binario
alternativa 3 : 26&27 = binario & binario
sean como sean enviados los datos tengo que mostrarlos en 4 display de 7 segmentos = 2 4 2 7
mis amigos del foro, disculpen si los considero asi , pero con lo que me han ayudado ya son como amigos,,
tengo este programa que lee la trama serial y es el programa que he estado completando con todas las correcciones , incluso pude incluir la instrucción getc, la que me recomendaron ya que era la mejor opción para estos casos.

este programa lo cargue a la placa real, coloque un adptador usb-serial..y ademas instale el hercules programa que sirve para enviar datos por el puerto serial....pero no pude lograr nada.....por mas que enviaba datos en hex o binario los display no mostraban ningun numero..obviamente revise todo,conecion programa incluso el hercules pero todo estaba ok, incluso instale un programa mas basico en el pic ..como encender un led por el puerto serial con una A y apagar con B,, y todo anda perfecto..........y cunado carge el programa mas importante no paso nada nuevamente... alguien me podria decir por que podria pasar esto.....por favor ?????
les dejo el programa
#include <16f628A.H>
#fuses NOMCLR
#fuses INTRC_IO
#FUSES NOWDT //No Watch Dog Timer
//#FUSES XT //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=4000000)
#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b2, rcv = pin_b1)
#define display_1 PIN_B4
#define display_2 PIN_B5
#define display_3 PIN_B6
#define display_4 PIN_B7
void alarma(void);
// NUMEROS [0-9] = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
// NUMEROS [0-9] = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
int Numeros[10] = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
char trama_serial[10]; // Arreglo para recibir los datos.
int1 flag_rx = 0; // Variable bandera de recepción.
volatile int indice=0;
int8 basura;
INT i;
void RECEPCION_RS232(void)
{
if(i<4) // Solo 4 valores nomas.
{
trama_serial
[indice
]=getc(); indice++;
}
else
{
flag_rx = 1; // Se indica recepción completa.
basura
= getc(); // Descarto el caracter }
}
void main (void)
{
int tiempo = 10;
int8 j;
set_tris_a(0x00);
set_tris_b(0x02);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (true)
{
if(flag_rx == 1) // Si hay datos en el buffer...
{
// Pasamos de ASCII a decimal
for( j=0 ; j<4 ; j++)
{
trama_serial[j] -= 48;
}
// Mostramos por UART
printf("%d%d%d%d\r",trama_serial
[0],trama_serial
[1],trama_serial
[2],trama_serial
[3]);
// Mostramos ahora por el puerto A, cada numero
output_b(0x12);
output_a(Numeros[trama_serial[0]]);
delay_ms(tiempo);
output_b(0x22);
output_a(Numeros[trama_serial[1]]);
delay_ms(tiempo);
output_b(0x42);
output_a(Numeros[trama_serial[2]]);
delay_ms(tiempo);
output_b(0x82);
output_a(Numeros[trama_serial[3]]);
delay_ms(tiempo);
// Limpio el indice para que comience de nuevo Y limpio el flag para indicar que termino y no entre mas aca hasta que se llene
indice=0;
flag_rx = 0;
}
}
}