Extraños problemas detectados

He detectado varios problemas que me ocurren sin tener porque aparecer, aparentemente.
En ocasiones deja de funcionar cuando añado un simple Serial.print en el código, lo comento y vuelve a funcionar correctamente...

Tengo una rutina para generar una cadena alfanumerica aleatoria:

void GenerateRamdom(char *ranstr, int len)
{
  char alphabet[62] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
  len = len+1;
  memset(ranstr, 0, len);
  for(int i = 0; i<(len-1); i++){
  ranstr[i]= alphabet[random(0,61)]; 
  }
}

Si os fijais, pongo len = len+1 y posteriormente dentro del for, i<(len-1). Es algo redundante, pero así es como he conseguido que me funcione, de hecho de devuelve cadenas como:

wMRl6vfI
bdoy839S
8WLzAVx6
baMaJqbb

Si lo pongo como debería de ser a mi entender:

void GenerateRamdom(char *ranstr, int len)
{
  char alphabet[62] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
  memset(ranstr, 0, len);
  for(int i = 0; i<len; i++){
  ranstr[i]= alphabet[random(0,61)]; 
  }
}

Me responde con cadenas así:

wMRl6vfI¦n
bdoy839S¦n
8WLzAVx6¦n
baMaJqbb¦n
LA52knf1¦n
uSrsm49L¦n
ULlyH5PH¦n
alWWrTQ1¦n

Además, dispongo de un código mucho más largo para un UNO con shield ethernet, si incluyo esto:

    client.print(" name=");
    char newstr[6];
    GenerateRamdom(newstr, 6);
    client.print(newstr);

Deja de funcionar, si lo comento, funciona correctamente. Lo más gracioso es que esa parte del código está dentro de una rutina que se activa mediante un botón y el programa se detiene al principio, sin ni siquiera hacer lo que debe hacer antes de que pulse el botón.

En un principio pensé que podría ser algun problema de memoria llena, pero el total de variables son 1020bytes y el programa 13,794bytes, lo cual no llega ni a la mitad de su capacidad.

A alguien le ha ocurrido algo así? Estoy empezando a pensar que mi UNO puede tener algún defecto. Es una placa nueva comprada hace 1 semana y ya no sé que pensar.

Saludos.

Con los punteros no me llevo bien ,pero si te vale un String ,puedes probar con esto a ver que tal:

char alfabeto[62] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

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

void loop(){
  Serial.println(combinacion(8));
  delay(1000);
}

String combinacion(int longitud){
  String cadena;
  for (int cont = 0;cont < longitud;cont++){
    cadena += alfabeto[random(0,61)];
  }  
  return cadena;
}

Tambien te recomiendo que el array alfabeto lo declares global si te sobra ram (o en memoria de programa si te sobra y te falta ram ,con PROGMEM) ya que declarar un array de 62 elementos cada vez que ejecutas la funcion te va a ralentizar el programa.

El error es porque nunca le dices al puntero de la cadena cuando termina la cadena propiamente dicha

Eso lo haces con '\0'
De lo contrario mostrará caracteres viejos.

Ejemplo un simple ranstr[0] = '\0'; // le dice que no hay cadena.

O al terminar luego de copiar los caracteres que corresponden a len usa para el siguiente ranstr[len+1] = '\0';

Gracias a todos,

Efectivamente los problemas que me causaba era por la falta de ram. He modificado mi código poniendo Serial.print(F("texto")) en todos los mensajes al monitor serie, y ha disminuido muchísimo el uso de ram, además de funcionar correctamente el código. Si que ha aumentado el tamaño usado por el programa pero aún así tengo espacio de sobra.

También he declarado el array alfabeto como global, ahorrando ese uso de memoria y ram.

surbyte, he corregido el problema usando String.

Ahora todo funciona correctamente.
He empezado con arduino hace una semana y el proyecto es algo complejo, por lo que me surgen algunas dudas.

Aquí la rutina que utilizo para generar cadenas aleatoria, por si a alguien le interesa:

char alphabet[36] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

String GenerateRamdom(int len)
{
  String rndstr;
  for(int i = 0; i<len; i++){
    rndstr = String(rndstr + alphabet[TrueRandom.random(1,36)]);
  }
  return rndstr;
}

He suprimido las mayúsculas, pero se pueden incluir fácilmente. Por otro lado uso la librería TrueRandom debido a que usando la funcion random nativa se repetían las cadenas cuando apagabas y volvías a encender el arduino y de este modo me aseguro que siempre sean diferentes y aleatorias.

Gracias por vuestra ayuda y respuestas.

Puedes conseguir mas aleatoriedad añadiendo esta linea al setup():

randomSeed(analogRead(A0));

y usando como parametro un pin analogico que no este conectado a nada.esto coge la lectura del pin analogico y genera los random a partir de esa lectura ,como el pin no esta conectado a nada ,suele dar diferentes lecturas y por lo tanto diferentes numeros aleatorios.me imagino que internamente esa libreria hara algo parecido.

También he declarado el array alfabeto como global, ahorrando ese uso de memoria y ram.

Solo ahorrarias ram si guardas el array en memoria flash de programa con PROGMEM ,si la declaras como global ,esta almacenada en ram(y si la declaras en la funcion estara en ram mientras se este ejecutando la funcion).lo que te dije es que si te sobraba ram la declararas global ,ya que al hacerlo dentro de la funcion como lo tenias ,el array se crea cada vez que se ejecuta la funcion y se destruye al acabar.esto no es muy significativo para una o dos variables ,pero para un array de tantos elementos puede que si.