Autor Tema: Recibir varios bytes con UART por software  (Leído 4849 veces)

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

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Recibir varios bytes con UART por software
« en: 24 de Octubre de 2009, 10:43:41 »
Hola,

En primer lugar decir que he buscado por el foro pero no he encontrado nada que me funcine. El tema es que tengo que recibir 8 bytes seguidos por una UART por software y el programa funciona bien cuando los 8 bytes llegan pero si hay un error (quitar el cable, por ejemplo) no me salta el tiemout que he creado.

El código es:

Código: [Seleccionar]

short receive_bytes()
{
   int nBytes = 0;

   set_timer0(0);
   
   while(nBytes < 8)
   {
      if(flagTimeout)
         return 0;
     
      if(kbhit())
      {
         buffer[nBytes++] = getchar();
      }
   }

   return 1;
}

El Timer0 está configurado para que salte a los 60ms y active flagTimeout, nada más. Como digo, el programa se queda a la espera de los 8 caracteres, haya el tiempo que sea entre ellos.

Qué puede ser?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Recibir varios bytes con UART por software
« Respuesta #1 en: 24 de Octubre de 2009, 11:29:58 »
Coloca el código completo así vemos donde puede estar el problema  :? Igual revisa por aquí.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Recibir varios bytes con UART por software
« Respuesta #2 en: 24 de Octubre de 2009, 14:55:48 »
Hola.

Pues no se como tengas el resto de codigo, pero no tocaria habilitar las interrupciones del Timer0 para que comience a contar? o siempre esta contando?
El papel lo aguanta todo

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Recibir varios bytes con UART por software
« Respuesta #3 en: 24 de Octubre de 2009, 17:44:31 »
El resto del código del subiré el lunes pero básicamente:

El timer0 siempre cuenta e interrumpe cada 64ms. En la interrupción lo único que hace es: flagTimeout = 1;

El main es algo así:

Código: [Seleccionar]
void main
{
   CONFIGURACIÓN DEL PIC...

   if(kbhit)
   {
      c = getchar();
      if(c == 'G')
      {
            flagTimeout = 0;
            receive_bytes();
       }

       HACER MÁS COSAS...
}


La transmisión es a 9600 por lo que con una interrupción de 64ms tengo suficiente para recibir los 8 bytes antes de que salte. El problema es que si le mando los bytes uno a uno, el programa me los va cogiendo, sea el que sea el tiempo que tardo en enviarlos, es decir el timeout nunca salta.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Recibir varios bytes con UART por software
« Respuesta #4 en: 24 de Octubre de 2009, 23:09:59 »
Pues si siempre esta contando, deberias poner a 0 el flag antes de setear a 0 el timer.

Saludos
El papel lo aguanta todo

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Recibir varios bytes con UART por software
« Respuesta #5 en: 25 de Octubre de 2009, 07:49:50 »
Pues si siempre esta contando, deberias poner a 0 el flag antes de setear a 0 el timer.

Saludos

Si, tengo que cambiarlo y pasarlo del main a justo antes de hacer el set pero eso no afectaría al error que tengo. En este caso, tal cual está ahora, el flag seguramente se ponga a 1 durante la recepción por lo que no entiendo por qué no sale de la función. El problema es que sequeda en el bucle kbhit - getchar hasta que no recibe los 8 bytes y eso que se los mando de uno en uno con almenos 2 o 3 segundos de margen.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Recibir varios bytes con UART por software
« Respuesta #6 en: 25 de Octubre de 2009, 10:56:29 »
Leyendo el manual de CCS me he dado cuenta de que la función return se utiliza así:
Código: [Seleccionar]
return(0);
Y no así:
Código: [Seleccionar]
return 0;
A ver si va a ser eso...

Mañana lo pruebo.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Recibir varios bytes con UART por software
« Respuesta #7 en: 26 de Octubre de 2009, 06:14:11 »
Solucionado el problema del timeout!! Era un fallo tonto de codificación.

La única duda que me queda es si los 64ms son suficientes para lo que quiero hacer, a ver si alguien me puede ayudar con lo que he calculado:

El tema va así:

El PC envía la letra C (de Configuración) al PIC.
El PIC al recibir la letra C envía un ACK al PC y espera los 8 bytes de datos.
El timeout, desde que envía el ACK hasta que deja de esperar los bytes es de 64ms (lo que tarda el timer0 en desbordarse).

Según mis cálculos sería: 8 bytes * 10 bits por bytes * 1 / 9600 bps = 8,33ms. Me sobran más de 50ms. ¿Está ok? El programa del PC todavía no lo he hecho.

Gracias!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Recibir varios bytes con UART por software
« Respuesta #8 en: 26 de Octubre de 2009, 09:22:17 »
Hay un tiempito entre byte y bytes pero no debería afectar, hay tiempo suficiente  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Lejan

  • PIC10
  • *
  • Mensajes: 25
Re: Recibir varios bytes con UART por software
« Respuesta #9 en: 04 de Diciembre de 2009, 16:47:03 »
Hola, alguién sabrá como hacer para recibir los bytes enviados por el pic a la PC y guardarlos en un archivo? Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Recibir varios bytes con UART por software
« Respuesta #10 en: 04 de Diciembre de 2009, 20:55:43 »
Hola, alguién sabrá como hacer para recibir los bytes enviados por el pic a la PC y guardarlos en un archivo? Gracias

Depende del lenguaje que utilices y el soft, debes determinar eso primero. Hay subforos dedicados a eso  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Recibir varios bytes con UART por software
« Respuesta #11 en: 05 de Diciembre de 2009, 00:15:55 »
Hola, alguién sabrá como hacer para recibir los bytes enviados por el pic a la PC y guardarlos en un archivo? Gracias

La forma más rápida de lograr eso es usando la hyperterminal. Checa los menús, hay uno para guardar todo el texto recibido en un archivo.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Recibir varios bytes con UART por software
« Respuesta #12 en: 05 de Diciembre de 2009, 00:17:39 »
Por el hyperterminal de Window$$$$ es sencillo:

1. Abres el hyperterminal.
2. Antes de inciar la transferencia de datos: Transfer/Capture Text
3. Indicas la ruta para guardar el archivo y seleccionas la extension de archivo.
4. Start
5. Habilitas la transferencia de datos
6. Al finalizar el envio de datos: Transfer/Capture Text/Stop
7. Listo  ;-)

Saludos

EDITO: Pucha mig, me demoré escribiendo. Estos son los pasos con el hyperterminal  :mrgreen:
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Recibir varios bytes con UART por software
« Respuesta #13 en: 05 de Diciembre de 2009, 00:22:20 »
 :oops: Eso me pasa por no usar hyperterminal, la complique  :D :D
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Recibir varios bytes con UART por software
« Respuesta #14 en: 05 de Diciembre de 2009, 12:41:36 »
Por el hyperterminal de Window$$$$ es sencillo:

1. Abres el hyperterminal.
2. Antes de inciar la transferencia de datos: Transfer/Capture Text
3. Indicas la ruta para guardar el archivo y seleccionas la extension de archivo.
4. Start
5. Habilitas la transferencia de datos
6. Al finalizar el envio de datos: Transfer/Capture Text/Stop
7. Listo  ;-)

Saludos

EDITO: Pucha mig, me demoré escribiendo. Estos son los pasos con el hyperterminal  :mrgreen:

jejeje  :D

El chiste es indicarles por donde empezar a buscar y qué ellos investiguen por su cuenta leyendo los menús... así se la dejaste bien fácil.  ;-)  :mrgreen: