Exacto es para eso, comprobación de errores.
Si checsum recibido = rx_dato0+rx_dato1+rx_dato2+rx_dato3.
Si los dato se corrompen y varían pero por un casual la suma siguiera siendo correcta, esto es poco probable, obtendríamos una validación errónea de la trama.
Mientras que por otro lado, el código recompuesto recibido 6535 y que se empleará para calculo de checsum, no le queda más remedio que sea igual 6535 si fuere otro, el calculo tendria que ser distinto sin remedio.
Dejo unas funciones simples para el correcto manejo del puerto serie para principiantes.
Estan integradas en un programa que de vuelve el caracter que recibe, programa ECO.
Despues de estudiar este programa creo que no será muy dificil continuarlo.
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'********************************** PIC Entrenadora BASIC ***************************************
'NOMBRE: 16F88_Pic_EBasic_RS232_ECO_10
'VERSION: 1.0
'MICRO: PIC16F88
'Fecha/Autor: 8/11 by COS
'VERSION 1.0.
'Practicas con puerto serie "Para principiantes"
'Funciones basicas para el correcto manejo del puerto RS232
'Programa responde ECO por el Hyperterminal
'**************************************************************************
'Puerto LCD----------------------------------------------------------------
Define LCD_BITS = 4 'Bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'Bus de datos sera el puerto A
Define LCD_DBIT = 0 'Bus datos seran 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'Se usara el RB7 como RS
Define LCD_EREG = PORTB 'Bit de control E sera del puerto B
Define LCD_EBIT = 6 'Se usara el RB6 como E
Define LCD_COMMANDUS = 500 'Espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Espera despues inicializar LCD, solo se ejecuta una vez (mSeg).
'Configuración de los módulos-----------------------------------------------
ANSEL = 0x00 'Los pin I/O digitales
CMCON = 0x07 'Comparador a off
OSCCON = 0x7e 'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'Puerto B como salidas
TRISA.4 = 1 'Como entrada (RA4, adc)
TRISA.6 = 1 'Como entrada (RA6, tecla S1)
TRISA.5 = 1 'Como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1 'RB2 (Rx, RS232)
PORTB.3 = 1 'Luz lcd a On (RB3)
PORTA.7 = 1 'Led amarillo a Off
PORTB.0 = 1 'Led verde a Off
'******************************************************************
Lcdinit 'Inicializa el LCD sin cursor
'Reasignacion de nombres----------------------------------------------
Symbol led_amarillo = PORTA.7 'Led amarillo
Symbol led_verde = PORTB.0 'Led verde
'*********************************************************************
Call clearbufer() 'Inicializa Uart
'*********************************************************************
main:
If overbufer = True Then Call clearbufer() 'Inicializa Uart
If bufer = True Then Call rd_byte() 'Lee un byte del puerto RS232
Goto main
End
'*************************************************
'Funciones lectura puerto serie RS232*************
Symbol overbufer = RCSTA.OERR 'Bit error Uart
Symbol bufer = PIR1.RCIF 'Bit hay datos Uart
'Mantiene el modulo Usart operativo
'No parametros de entrada
'Call clearbufer()
'If overbufer = True Then Call clearbufer()
Proc clearbufer()
Dim papelera As Byte
Hseropen 9600 'Velocidad del puerto serie, configura Usart
RCSTA.CREN = 0 'Disable
Hserget papelera 'Limpia bufer Uart
Hserget papelera
Hserget papelera
RCSTA.CREN = 1 'Enable, Continuous Receive Enable bit*/
End Proc
'Lee bufer Uart, eco serie RS232
'Retorna el dato en la variable rd_byte
'No parametros de entrada
'Call rd_byte()
'If bufer = True Then Call rd_byte()
Function rd_byte() As Byte
Hserget rd_byte 'Carga el dato en el bufer
Hserout rd_byte 'Envia dato puerto serie RS232
End Function
'*************************************************
'End