Código para leer determinados datos de un buffer

Estoy en un proyecto para crear un discriminador de llamadas telefónicas. El caso es que puedo recibir datos en el buffer serie de Arduino en el formato: NMBR = 123456789 y almacenarlo en una variable. Mi problema es que no veo la manera de conseguir separar el "NMBR =" del número, y poder usar el número para guardarlo en una variable y poder almacenarlo secuencialmente en un fichero de texto en tarjeta SD. He usado varios comandos de parsing de la biblioteca string.h, pero no consigo hacerlo. Lo mas que he podido es poder leer el valor NMBR usando el "=" como separador, pero no lee el número. Alguien me puede ayudar?
Gracias por adelantado.

Uhh ese tema me costó aprenderlo pero es asi

Los objetos String son muy poderosos y pueden hacer todo lo que le pidas.

Los Strings tienen un método llamado indexOf() que permite buscar el indice en vector String de cualquier caracter particular.
Si no se encuentra el caracter responderá con un -1.
Un segundo parámetro puede agregarse a la funcion para indicar el punto de arranque de dicha búsqueda.
Entonces para tu caso, tu delimitador es =

int igualIndex = myString.indexOf('=');
//  Busca el siguiente igual justo después del primero
int segundoIgualIndex = myString.indexOf(=,', igualIndex+1);

Entonces se puede usar ese indice para crear un subString usando método sbustring() que está disponible en la clase String.
Como sería en tu caso

String primerValor= myString.substring(0, igualIndex);
String segundoValor = myString.substring(igualIndex+1, segundoIgualIndex);

Tu respuesta es segundoValor contendrá _123456789
asi que en tu caso usaremos un +2 para olvidarnos del espacio entre = y el 1.

String segundoValor = myString.substring(igualIndex+2, segundoIgualIndex);

Saludos
Prueba este codigo y me dices si te gusta para hacer lo que quieres.

String texto = "NMBR = 123456789 ";
String numero = "";

void setup(){
  Serial.begin(115200);
  for(int i = 0; i <texto.length(); i++){
    if(isDigit(texto.charAt(i))) {  
      numero += texto.charAt(i);
    }
  }
  Serial.println(numero);
}

void loop(){
}

Acá mi versión

#include <Sttring.h>

String myString = "NMBR = 123456789";

void setup() {
  Serial.begin(9600);
}

void loop() {
  
  int Indice           = myString.indexOf('=');
  String ValorBuscado  = myString.substring(Indice+2);
  Serial.println(ValorBuscado);
  while(1);
}

Gracias a todos por vuestras respuestas. El caso es que yo manejo Char como valores que leo desde el puerto serie de mi modem y cuando implemento vuestros códigos se me llena la pantalla de errores. Supongo que mi pobre conocimiento de programación tiene la culpa de esto. De todas maneras he conseguido hacer lo que quería, ahora puedo discriminar el numero llamante y extraerlo de la cadena NMBR = 123456, y así ya he logrado discriminar este con respecto a un número almacenado como Char. Ahora tengo nuevos desafíos:

  • Crear un archivo en una tarjeta SD que contenga los números a bloquear.
  • Crear el código que escriba y borre un determinado número del fichero anterior.
  • Cómo hacer para comparar el número discriminado detectado con los existentes en el archivo de la SD
    Os pongo el código que tengo ya creado y mi solución a la extracción del valor numérico de la cadena, es una solución parcial, puesto que un carácter "espacio" al inicio del número es imposible de eliminar.
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

char nmbrstring[ ] = "NMBR";
char numerodete[20];
char numerotst[ ] =" 123456789";

int readline(int readch, char *buffer, int len)
{
  static int pos = 0;
  int rpos;

  if (readch > 0) {
    switch (readch) {
      case '\n': // Ignore new-lines
        break;
      case '\r': // Return on CR
        rpos = pos;
        pos = 0;  // Reset position index ready for next time
        return rpos;
      default:
        if (pos < len-1) {
          buffer[pos++] = readch;
          buffer[pos] = 0;
        }
    }
  }
  // No end of line has been found, so return -1.
  return -1;
}

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println("Setup is Ready\n");
  mySerial.write("ATZ\r\n");
  delay(4000);
  //mySerial.write("AT+VCID=1\r\n");//Conceptronics CID ON
  mySerial.write("AT#CID=1\r\n");//USR Robotics CID ON
  delay(2000);
  mySerial.write("ATS7=5\r\n");//USR Robotics Answer Wait 7 seg
  delay(2000);
  mySerial.write("ATS0=0\r\n");//USR Robotics Auto Answer OFF
  delay(2000);
 }

void loop()
{
  static char buffer[80];
  if (readline(mySerial.read(), buffer, 80) > 0) {
    Serial.print("Datos: >");
    Serial.print(buffer);
    Serial.println("<");
    
    char* numero1 = strchr(buffer, 'NMBR =');
    char* prefinmbr = strtok(buffer, " =");
    char* numero2 = strchr(numero1, ' ');
    /* // Comprobador serie deteccion numero
    Serial.println("Numero:");
    Serial.print(numero2);
    Serial.println("Prefinmbr:");
    Serial.print(prefinmbr);
    Serial.print("==");
    Serial.print(nmbrstring);
    Serial.print("\n");
    */
    if(strcmp(prefinmbr, nmbrstring) == 0)
    {
     //Lector de numero
     char* numerodete = numero2;
     Serial.print("Numero llamante es:\n");
     Serial.print(numerodete);
     Serial.print("\n");
    
    if(strcmp(numero2, numerotst) == 0)
    {
      Serial.print("Numero detectado es:\n");
      Serial.print(numero2);
      Serial.print("\n");
      //Serial.print("==");
      //Serial.print(numerotst);
      //Codigo contestar y colgar
     //mySerial.write("ATA\r\n");//Coge el tlf
     //delay(2000);
     //mySerial.write("ATH1\r\n");//Cuelga el tlf
     //delay(2000);
    }
    }
   }
}

Esta casi todo inventado y en lo único que estoy de acuerdo es en que Nosotros somos los malos programadores cuando algo no sale.
En tu caso existe la función trim() que quita caracteres no deseados de donde gustes.
mira

pero mas abajo te lo posteo y traduzco

para ello tienes que seguir usando String y su manejo que ya te mostré es muy potente.

trim() es util cuando sabes que hay caracteres en blanco al comiendo o final de un String. y quieres retirarlos.
Whitespace o Espacios en blanco refiere a caracteres que toman espacio (y memoria) y no son vistos.
Esto incluye el espacio (ASCII 32), tab (ASCII 9), vertical tab (ASCII 11), form feed (ASCII 12), carriage return (ASCII 13), or newline (ASCII 10). El ejemplo muestra a un String con espacios en blanco antes y despues del trimmeado

/*
  String length() and trim()
 
 Examples of how to use length() and trim() in a String
 
 created 27 July 2010
 modified 2 Apr 2012
 by Tom Igoe
 
 http://arduino.cc/en/Tutorial/StringLengthTrim
 
 This example code is in the public domain.
 */

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // send an intro:
  Serial.println("\n\nString  length() and trim():");
  Serial.println();
}

void loop() {
  // here's a String with empty spaces at the end (called white space):
  String stringOne = "Hello!       ";
  Serial.print(stringOne);
  Serial.print("<--- end of string. Length: ");
  Serial.println(stringOne.length());

  // trim the white space off the string:
  stringOne.trim();
  Serial.print(stringOne);
  Serial.print("<--- end of trimmed string. Length: ");
  Serial.println(stringOne.length());

  // do nothing while true:
  while(true);
}

Muchas gracias!!!! Ya he solucionado el dichoso problema del espacio inicial con el porte del trim() . También he encontrado código que funciona con mi board SD YL-30 para almacenar secuencialmente números y leerlos, con lo cual mi proyecto va avanzando. Ahora me queda integrar el código de lectura/escritura de los números en la SD, y posteriormente integrar el código de visualización en un Keypad shield 16x2 de 5 botones. Poco a poco.
Gracias a todos.