🛠 Dialoguer avec un GPS (ou tout module TTL) sur Serial1 sans bloquer la boucle

Arduino Due · intermediaire · Schéma : IMG-due-intermediaire-2-gps-non-bloquant-serial1.svg — module GPS connecté à l'Arduino Due sur Serial1 (RX=18, TX=19, GND, 3,3 V), encart « logique 3,3 V : niveau-baisseur requis pour un module 5 V », trame NMEA affichée.

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales