Autor Tema: Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte  (Leído 3385 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Hola amigos, pues eso es lo que quiero hacer, Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte. lo quiero porque estoy intetando,nuevamente la comunicacion serial, pero quiero implementar una funcion codificada.
Les agradesco de antemano, programao con Mikrobasic, y pic simulator ide.

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte
« Respuesta #1 en: 29 de Agosto de 2011, 09:11:47 »
Hola amigos, pues eso es lo que quiero hacer, Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte. lo quiero porque estoy intetando,nuevamente la comunicacion serial, pero quiero implementar una funcion codificada.
Les agradesco de antemano, programao con Mikrobasic, y pic simulator ide.

 hola buenos dias, si recibes los byte por puerto serial lo que tienesd que hacer es unir los dos primeros byte y formas un word, luego dos 2 bytes  siguientes tambien los unes y formas otro word ya teniendo los dos word unes eso dos word y formas double word y ya tienes la variable con los 4 byte y luego haces el proceso inverso separa la varible dobleword y obtienes el word1 y word2 y finalmente separas los word y obtienes los bytes como en un principio pero si recibes esos bytes desde puerto serial ya lo debes de tener en una variable no vea la necesidaqd de separar eldobleword  para obtener los byte que ya en un principio ya los tenias desde puerto serial.

Saludos y cualquier cosa avisa.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte
« Respuesta #2 en: 30 de Agosto de 2011, 06:57:44 »
Desconozco si será este el motivo, pero si esos 4Bytes forman un numero es conveniente primero reconstruir el numero y luego comprobar mediante este el checsum de la trama de datos, ya que si se hace esta comprobación con los bytes independientes según el tipo de checsum utilizado, puede engañar a este y dar los datos como buenos.
« Última modificación: 30 de Agosto de 2011, 07:17:19 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte
« Respuesta #3 en: 30 de Agosto de 2011, 09:15:38 »
De todas formas si lo que quieres es un programa básico para ir desarrollándolo, en PSI es muy fácil, te buscare uno para que lo estudies.
Saludos desde Granada, España.

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte
« Respuesta #4 en: 30 de Agosto de 2011, 09:51:30 »
Desconozco si será este el motivo, pero si esos 4Bytes forman un numero es conveniente primero reconstruir el numero y luego comprobar mediante este el checsum de la trama de datos, ya que si se hace esta comprobación con los bytes independientes según el tipo de checsum utilizado, puede engañar a este y dar los datos como buenos.

Hola buen dia estimado, colega puedes explicar mejor eso del comprobar el checksun esa parte no la entiendo ya que el amigo del post nos informo que el recibe 4 byte y quiere unirlo para formar una sola variable a que se refiere usted con el checksun.

Saludos y espero su gentil respuesta pero segun lo que entiendo es que el checksum de eso 4 byte es para coroborar si llevo bien esa trama de los 4 byte.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte
« Respuesta #5 en: 30 de Agosto de 2011, 13:03:49 »
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.

Código: [Seleccionar]
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
Saludos desde Granada, España.

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte
« Respuesta #6 en: 03 de Septiembre de 2011, 10:28:29 »
Buend dia amigos , me han dado buenas ideas, pero queria decirles que el manejo del puedto serie lo conosco , mas o menos, he tomado el ejemplo del amigo  dogflu, en el cual se recibe cada byte, y se almacena en un bufer , luego lo leo byte a byte tomandolo del bufer almacenado, en lo que ando metido es en controlpor RF, y he logrado transmitir sin problemas, pero el asunto es que quiero codificar el control , por eso quiero los 4 bytes para poder compararlos.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Recibir 4 bytes y guardarlos en una variable, luego leer la variable byte a byte
« Respuesta #7 en: 03 de Septiembre de 2011, 20:25:34 »
Si no recuerdo mal el Long se descompones o recompone de la siguiente manera en sus respectivos bytes.
Siendo code una variable tipo Long y code_rx una variable tipo byte que contiene siempre el byte ordenado a transferir.
code.HW = code_rx (byte 3)
code.LW = code_rx (byte 2)
code.HB = code_rx (byte 1)
code.LB = code_rx (byte 0)
Saludos desde Granada, España.