char array obtiene datos fantasma (arduino)

0

Estoy configurando una matriz con datos de una EEPROM. Como puede ver en el código a continuación, hago una instancia de una matriz, hago un ciclo 16 veces y la lleno con datos leídos desde la EEPROM. He probado los datos que se leen de la EEPROM que es correcta, pero si imprimo la matriz después del bucle obtengo 18 caracteres. No puedo averiguar de dónde vienen los datos. ¿Alguna idea?

void send_eeprom_data()
{
  char eeprom_data[16];
  for(int i = 0; i < 16; i++) {
    eeprom_data[i] = read_eeprom(8, i);
  }
  Serial.print(eeprom_data);
}

/* READ AND TRANSFER FUNCTIONS */
char spi_transfer(volatile char data) {
  SPDR = data;
  while(!(SPSR & (1 << SPIF)))
  {
  };
  return SPDR;
}

byte read_eeprom(int ss, int address) {
  int data;
  digitalWrite(ss, LOW);
  spi_transfer(READ);
  spi_transfer((char)(address));
  data = spi_transfer(0xFF);
  digitalWrite(ss, HIGH);
  return data;
}

actualizar

Cambié el código a lo siguiente:

void send_eeprom_data()
{
  char eeprom_data[16];
  for(int i = 0; i < 16; i++) {
    eeprom_data[i] = 'a';
  }
  Serial.print(eeprom_data);
}

Salida:

aaaaaaaaaaaaaaaaûz

(16 a)

    
pregunta Jeroen

2 respuestas

5

lo más probable es que la impresión

espere una cadena terminada en cero (casi todo el universo C lo hace). No terminó su cadena con un '\ 0', por lo que continúa imprimiendo después de sus 16 caracteres hasta que encuentra uno.

PS, esta es una pregunta de C pura.

    
respondido por el Wouter van Ooijen
4

Aunque declare que su variable eeprom_data es una matriz de tipo char (con 16 elementos), la variable "eeprom_data" en sí misma es simplemente un puntero al primer elemento de esta matriz. Cuando pasa este puntero a Serial.print (), esta función no sabe cuánto tiempo dura la matriz, y como lo señaló @ Wouter-van-Ooijen, sigue leyendo (es decir, incrementa el puntero) hasta que encuentra un carácter "cero". (el byte valor 0). Parece que * es el tercer carácter después del final de la matriz de caracteres, pero podría ser mucho más tarde y, por lo tanto, sigue imprimiendo estos valores adicionales que encuentra.

*) como nota aparte: dije que "aparece", porque es muy posible que haya otros caracteres que no sean cero que no estén impresos en el terminal, simplemente porque son caracteres no imprimibles / de control.

    
respondido por el fm_andreas

Lea otras preguntas en las etiquetas