Captura de datos del puerto serie por interrupción

Hola a todos.
Estoy trabajando con un gps y necesitaría poder leer los caracteres que arroja pero por interrupción (para irlos almacenando y procesarlos posteriormente) ya que el arduino (nano) está haciendo otras cosas...
He probado a leer sólamente del puerto y va bien, pero cuando no sólo se dedica a eso...empiezan a fallar.
¿Sabéis si se puede utilizar una interrupción en el puerto serie?
P.D. Estoy utilizando la librería "NewSoftSerial"

NewSoftSerial utiliza extensamente las interrupciones, por lo que no es nada recomendable meter nada de código extra dentro de sus interrupciones ya que podrías perder muy fácilmente los datos que te estén siendo enviados.

De todas maneras se van guardando los carácteres que llegan por el puerto serie en un buffer hasta que los pides (¿te suena Serial.available()?), no estaría mal que le echaras un vistazo a los ejemplos que vienen en el IDE y a la referencia para saber un poco mejor como funciona.

La página donde se alberga newsoftserial habla precisamente de lo que quieres hacer:

Without interrupts, your program's design is considerably restricted, as it must continually poll the serial port at very short, regular intervals. This makes it nearly impossible, for example, to use SoftwareSerial to receive GPS data and parse it into a usable form. Your program is too busy trying to keep up with NMEA characters as they arrive to actually spend time assembling them into something meaningful. This is where AFSoftSerial's (and NewSoftSerial's) interrupt architecture is a godsend. Using interrupt-driven RX, your program fills its buffer behind the scenes while processing previously received data.

De todas maneras, ¿por qué dices que empieza a fallar?

Un saludo

Hola Chiva. Gracias por tu respuesta.
A ver si logro explicarme.
En el "loop", tengo una serie de booleanos que chequeo para ejecutar una serie de acciones. Esos booleanos se ponen a true en una interrupción puesta en un timer.
El gps por su parte "escupe" datos cada segundo...El caso es que durante los tiempos que los booleanos están a false no se ejecuta nada más que la lectura del puerto serie, y lo que leo, lo escribo en el hyperterminal...pero no logro capturar todos los datos de manera fluida. Un ejemplo de lo digo....

$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,011052.033,V,,,,,,,150209,,,N45
$GPGGA,011053.033,,,,,0,00,,,M,0.0,M,,0000
50
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,011053.033,V,,,,,,,150209,,,N44
$GPGGA,011054.033,,,,,0,00,,,M,0.0,M,,0000
57
$GPGSA,A,1,,,,,,$GPGGA,011055.033,,,,,0,00,,,M,0.0,M,,000056
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,011055.033,V,,,,,,,150209,,,N
42
$GPGGA,011056.033,,,,,0,00,,,M,0.0,M,,000055
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,011056.033,V,,,,,,,150209,,,N
41

Como ves, hay veces que empieza a escribir por la mitad, otras escribe bien, otras escribe la mitad de los datos....Para que puedas comparar, lo que debería recibir continuamente es:

$GPGGA,011255.033,,,,,0,00,,,M,0.0,M,,000054
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,011255.033,V,,,,,,,150209,,,N
40
$GPGGA,011255.033,,,,,0,00,,,M,0.0,M,,000054
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,011255.033,V,,,,,,,150209,,,N
40
$GPGGA,011255.033,,,,,0,00,,,M,0.0,M,,000054
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,011255.033,V,,,,,,,150209,,,N
40
.
.
.
.

Que es lo que me da el gps...

Prueba a poner en el Arduino un código que sólo lea el GPS y lo mande al PC y nos cuentas que tal te fue, para ir descartando problemas

Eso va bien...ya lo he probado.
¿Puede ser que la librería "NewSoftSerial" utiliza el timer 2? Es el que estoy utilizando (#include <MsTimer2.h>)

He desconectado el timer durante la parte del programa que lee del puerto y escribe y funciona bien...pero me he cargado la funcionalidad del timer...creo que es con lo que se está dando de narices.
Creo que cuando entra la interrupción del timer, pierdo la del puerto y deja de almacenar datos...me da la sensación de que esto es insalvable....

¿Sabeis si hay alguna manera de dejar que el micro coja datos del puerto por interrupción y los vaya almacenando para lanzar la ejecución de la rutina asociada cuando se lea el clásico "\r\n"? (Esto se hará por programa, se comprobará con cada carácter recibido en la propia rutina de atención a la interrupción)
Esto apenas consume recursos hasta que se lea una cadena completa.

¿A qué te refieres con desconectar el timer/funcionalidad del timer?

Hola,

Puedes mirar el código de Arduino,que eso mismo es lo que hace (recoger por interrupción y guardarlo en un buffer -> "HardwareSerial.cpp"). Tendrías que adaptarlo para usar interrupción de cambio de estado del pin, ya que no estas usando la UART.

De todas formas, estas haciendo otra cosa con el puerto serie? Me refiero a por qué estas usando NewSoftSerial en vez de usar la propia UART del micro, que te libera mucho para poder hacer otras tareas. Ya que te "avisa" (interrupcion ó con un flag) de cuando ha recibido un dato y sólo tienes que leer un registro cuando ya se ha recibido el byte completo, en vez de estar continuamente monitorizando.
Ten en cuenta, que a 9600 baudios, con 1 bit de start + 8 bits datos y 1 de stop, es aproximádamente 1 ms recibir un sólo byte. Es un tiempo considerable y más con tramas NMEA en ascii que son muchos carácteres (bytes) los que estas recibiendo.

A parte, si estas usando interrupciones de timers + interrupciones de cambio de estado de pines + interrupción puerto serie ..... empieza a ser un poco "incontrolado".... Para que te hagas una idea, en muchas aplicaciones en "tiempo real" usan la regla de una sola interrupción por microcontrolador (normalmente un Timer para ir organizando las diferentes tareas). Que entiendo que algo parecido estas haciendo con el Timer2, no??

Salu2

Igor R.

Hola Chiva.
Lo de la funcionalidad del timer que me refería es que se dejan de llamar a las funciones que necesitan que dicho timer ponga valores a true para que se ejecuten...pero vamos...por ahí no iban los tiros...

En cuanto a lo que me comentas Igor. Estoy utilizando NewSoftserial porque tiene un buffer que puedes modificar. Yo lo tengo puesto a 200 bytes (modificando el valor de NewSoftSerial.h ):

#define _NewSS_MAX_RX_BUFF 200 // RX buffer size

Viene por defecto a 64. Antes también tenía problemas de overflow y ya está solucionado.
En cuanto a las interrupciones...la verdad es que estoy usando un timer, una entrada de interrupción para contar pulsos y utilizaré otra para contar otros pulsos por lo que si que tengo al micro bastante cargado...
He visto algún consejo por internet de que cuando recibo muchos datos, haga bastantes consultas para ver si hay datos disponibles para capturarlos y hacer un flush del buffer para nuevas entradas. Hasta el momento tengo esto:

$GPGGA,005802.076,,,,,0,00,,,M,0.0,M,,000058
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,005802.076,V,,,,,,,150209,,,N
4C

$GPGGA,005803.076,,,,,0,00,,,M,0.0,M,,000059
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,005803.076,V,,,,,,,150209,,,N
4D

$GPGGA,005804.076,,,,,0,00,,,M,0.0,M,,00005E
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,005804.076,V,,,,,,,150209,,,N
4A

$GPGGA,005805.076,,,,,0,00,,,M,0.0,M,,00005F
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,005805.076,V,,,,,,,150209,,,N
4B

$GPGGA,005806.076,,,,,0,00,,,M,0.0,M,,00005C
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,005806.076,V,,,,,,,150209,,,N
48

$GPGGA,005807.076,,,,,0,00,,,M,0.0,M,,00005D
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,005807.076,V,,,,,,,150209,,,N
49

$
08.0
,,,M,
0*52

,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,005808.076,V,,,,,,,150209,,,N*46

$
09.07
,,,M,0.0,M,,000053
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,005809.076,V,,,,,,,150209,,,N
47

$
10.0
0,,,M
00*5B

1,,,,,,
E
$GPG
9
$GPRMC,005810.076,V,,,,,,,150209,,,N*4F

$

Esto ya es mucho más limpio que lo que tenía, pero como veis, hay veces que consulto el buffer y me dice que tiene datos, pero leo una especie de basura unas veces y luego leo los datos bien...además parece ser cíclico...

Hola de nuevo...estoy estudiando la salida del hyperterminal, sacando los 200 bytes que copio directamente del buffer y tengo lo siguiente:

Ê
o[ch151]
$GPGGA,012504.076,,,,,0,00,,,M,0.0,M,,000055
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,012504.076,V,,,,,,,150209,,,N
41
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Ê
N[ch155]
$GPGGA,012505.076,,,,,0,00,,,M,0.0,M,,000054
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,012505.076,V,,,,,,,150209,,,N
40
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Ê
.[ch159]
$ÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Ê

506.076,,,,,0,00,,,M,0.0,M,,000057
$GPGSA,A,1,,,,,,,,,,,,,,,1E
$GPGSV,1,1,00
79
$GPRMC,012506.076,V,,,,,,,150209,,,N
43
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

Como veis, cuando accedo al buffer, tengo dos caracteres que no se de donde salen...luego recibo las 4 cadenas que me envía el GPS y termina con muchos caracteres "ÿ
", que es el resto del buffer (previamente borrado que no se ha llenado de ningún caracter).
Como veis, en la lectura que sale mal, se aprecia la cabecera de lo que debería entrar en realidad, pero mezclado con muchas "ÿ
", los dos caracteres que no se de donde salen y el final, que sale bien, igual que las otras....¿alguna idea?

Hola.
He conseguido saber porqué me salian esos dos caracteres...parece que si utilizas:
Serial.print(linea); donde linea es la matriz que almacena todo el buffer, salen dichos caracteres por el hyperterminal.
En cambio si utilizas:
for (int i=0;i<200;i++)
{
Serial.print(linea*,BYTE); *

  • }*
    Logramos sacar:
    $GPGGA,013953.076,,,,,0,00,,,M,0.0,M,,0000*5A
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,013953.076,V,,,,,,,150209,,,N*4E
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    $GPGGA,013954.076,,,,,0,00,,,M,0.0,M,,0000*5D
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,013954.076,V,,,,,,,150209,,,N*49
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    $GPGGA,013955.076,,,,,0,00,,,M,0.0,M,,0000*5C
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,013955.076,V,,,,,,,150209,,,N*48
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    $GPGGA,013956.076,,,,,0,00,,,M,0.0,M,,0000*5F
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,013956.076,V,,,,,,,150209,,,N*4B
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    $GPGGA,013957.076,,,,,0,00,,,M,0.0,M,,0000*5E
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,013957.076,V,,,,,,,150209,,,N*4A
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    $GPGGA,013958.076,,,,,0,00,,,M,0.0,M,,0000*51
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,013958.076,V,,,,,,,150209,,,N*45
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    $ÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3ÿÿÿÿÿ
    959.076,,,,,0,00,,,M,0.0,M,,0000*50
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,013959.076,V,,,,,,,150209,,,N*44
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    $ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1ÿÿÿÿÿÿÿÿÿÿÿ
    4000.076,,,,,0,00,,,M,0.0,M,,0000*52
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,014000.076,V,,,,,,,150209,,,N*46
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    $ÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    4001.076,,,,,0,00,,,M,0.0,M,,0000*53
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,014001.076,V,,,,,,,150209,,,N*47
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    2.076,,,,,0,00,,,M,0.0,M,,0000*50
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,014002.076,V,,,,,,,150209,,,N*44
    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
    Sigo teniendo el problema de la recepción mala a periodos ciclicos....

¿Y por qué no usas Serial.available() y Serial.read()?

El buffer del puerto serie (UART) lo puedes modificar. En mi opinión, no tiene ningún sentido usar NewSoftSerial.
Tienes que modificar #define RX_BUFFER_SIZE 128, que es lo que viene por defecto en Arduino, si quieres tener más de 128 bytes.

Lo tienes dentro de \hardware\arduino\cores\arduino
El archivo: HardwareSerial.cpp

Ten en cuenta,que la UART funciona de forma independiente y no sobrecargas al micro mientras estas haciendo otras cosas.

Ya que si estas recibiendo datos por pines normales (usando interrupciones), sin usar la UART y a la vez estas atendiendo a otra interrupción, por ejemplo la de contar pulsos que has dicho, has pensado lo que pasa? Qué frecuencia máxima tiene la señal de pulsos que estas midiendo? Qué velocidad estas usando para comunicarte con GPS? (estas preguntas son para reflexión)

Yo usaría:

  • UART del microcontrolador
  • Timers para contar los pulsos, y cada cierto tiempo miro el valor del registro y hago los cálculos (en vez de hacerlo por interrupción).
    [edit]Los Timer tienen un modo que se llama contador (Counter)[/edit]

Salu2

:wink:

Creo que voy a ir por donde me comentas Igor, porque no logro aislar completamente la información que necesito...
Una pregunta con respecto a utilizar el puerto serie del micro...¿te refieres a los pines que pone RX y TX no? Estoy utilizando un arduino nano y no se si he leido por ahí que ese puerto es el que utiliza para comunicarse con el PC (no se si estoy en lo cierto, por eso no lo he utilizado), es decir, que simplemente tiene la salida y la entrada, pero que no es utilizable para colocar otro dispositivo...
Por eso no me planteé utilizarlo.
Si se puede utilizar, ¿como puedo acceder a él?
Si hago una escritura, escribo : Serial.print ("loquesea"); y si escribo, Serial.read();
Con esto trabajo con el puerto serie virtual del arudino con el PC, pero no se como acceder al puerto de la placa (pines TX y RX)

Hola de nuevo.
Con respecto a mi última pregunta. Parece que simplemente hay que poner los pines como entrada (para el pin RX) y salida(para el pin TX) para utilizar los pines de la placa, o al menos es lo que he hecho yo y me ha funcionado.
Estuve hasta tarde trabajando en ello y por fin conseguí aislar perfectamente toda la información del gps, sin cortes ni caracateres raros.
El uso de Serial.available() y Serial.read() funcionó bien. Gracias por vuestra ayuda. :wink:

Los pines RX y TX de la placa están conectados con los que van al PC, para usarlos sólo tienes que hacer el típico Serial.begin.

Suerte con el resto del trabajo :wink: