🛠 Dialoguer avec un GPS (ou tout module TTL) sur Serial1 sans bloquer la boucle
Objetivos
La Due dispone de 4 UART físicos: Serial (pines 0/1, conectado al puerto de programación), Serial1 (USART0, pines 18/19), Serial2 (16/17) y Serial3 (14/15), sin contar con SerialUSB. Vas a conectar un módulo GPS (o cualquier dispositivo serie TTL) a Serial1, libre de uso USB, y aprenderás la lectura asíncrona mediante available/read con el análisis de tramas NMEA, para no bloquear nunca el bucle con un readString.
Material
- 1 Arduino Due
- 1 módulo GPS con salida TTL (tipo NEO-6M/7M) — atención: alimentar a 3,3 V, la Due solo acepta 3,3 V en sus pines; un módulo de 5 V requiere un adaptador de nivel en el TX del módulo
- 4 cables macho-macho, cable micro-USB
- Opcionalmente un adaptador USB-serie para probar el GPS antes
Código completo
// Lecteur de ligne non bloquant sur Serial1 (RX=18, TX=19)
char ligne[128];
size_t len = 0;
uint32_t dernierOctetMs = 0;
void setup {
SerialUSB.begin(115200); // debug sur le port Native
Serial1.begin(9600); // typical GPS baud (NEO-6M : 9600)
}
void loop {
// 1) Vider le FIFO sans jamais bloquer
while (Serial1.available) {
char c = (char)Serial1.read;
dernierOctetMs = millis;
if (c == '\n' || len == sizeof(ligne) - 1) { // fin de trame
ligne[len] = '\0';
if (len > 6 && strncmp(ligne, "$GNGGA", 6) == 0) {
SerialUSB.printf("trame GGA (%u octets)\n", (unsigned)len);
}
len = 0;
continue;
}
if (c != '\r') ligne[len++] = c;
}
// 2) Clôturer une trame orpheline après 100 ms de silence
if (len && millis - dernierOctetMs > 100) {
ligne[len] = '\0';
SerialUSB.printf("flush timeout: %s\n", ligne);
len = 0;
}
// 3) Ici, toute autre logique : l'attente série ne vous bloque jamais
}
Verificación esperada
En exteriores (con vista al cielo) o cerca de una ventana, el monitor Native muestra tramas NMEA completas; la trama $GNGGA aparece en cuanto el GPS tiene una posición fija. Desconectar el GPS no congela el bucle: el programa sigue ejecutándose (pruébalo con un LED). El LED TX del módulo parpadea al recibir datos.
Errores frecuentes
- Usar
readStringoreadStringUntil: son bloqueantes y hacen perder el loop durante segundos si el módulo deja de enviar datos — de ahí el patrónavailable/readanterior. - Conectar un módulo de 5 V directamente a RX1: el pin soporta máximo 3,3 V; el TX del módulo debe pasar por un convertidor de nivel (o elegir un módulo de 3,3 V).
- Invertir TX/RX: el módulo envía datos, pero la Due no recibe nada; cruza TX(módulo)→RX1(18) y RX(módulo)←TX1(19).
- Confundir Serial (0/1, ocupado por el puerto de programación) con Serial1: escribir en el puerto serie equivocado es el error clásico con los 4 UART de la Due.
- Esperar tramas válidas en interiores: sin posición fija, muchas tramas llegan vacías o sin datos de posición.
- Olvidar que SerialUSB bloquea si ningún host ha enumerado el CDC: en funcionamiento autónomo total, protege las impresiones grandes con
if (SerialUSB).
Otros tutoriales para esta placa
- Faire clignoter la LED de l'Arduino Due et apprivoiser ses deux ports USB
- Lire un potentiomètre avec le vrai ADC 12 bits de la Due
- Allumer une LED externe en respectant les broches 3,3 V et 9 mA de la Due
- Générer une vraie tension analogique avec les DAC 12 bits (broches 66 et 67)
- Scanner les deux bus I2C de la Due (Wire sur 20/21, Wire1 sur 70/71)
- Monter la Due sur un bus CAN 500 kbit/s avec un transceiver externe
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinodac-onde.inoArduinoadc-12-bits.inoArduinopwm-12-bits.inoArduinogps-serial1.inoArduino