Неожиданный символ добавляется в буферный массив char в serial monitor только при инициализации SD-карты

Я получаю неожиданный дополнительный символ, добавленный в строку печати последовательного монитора, только когда инициализирую SD - карту в коде.

Нормальный

Приведенный ниже код дает мне этот ожидаемый результат в последовательном мониторе:

Последовательный Монитор

23:31:12.745 -> inputString: abc

Код

const int BUF_DIM = 3;
char inputString[BUF_DIM];

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  
  inputString[0] = 'a';
  inputString[1] = 'b';
  inputString[2] = 'c';

  Serial.print("inputString: ");
  Serial.println(inputString);
}

void loop() {
}

Неожиданный символ

Однако последовательный монитор печатает неожиданный дополнительный M в конце значения abc inputString, когда я добавляю инициализацию SD - карты.

Последовательный Монитор

23:24:30.319 -> Initializing SD card...initialization done.
23:24:30.319 -> inputString: abcM

Код

#include <SPI.h>
#include <SD.h>


File myFile;

const int BUF_DIM = 3;

char inputString[BUF_DIM];


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

  //-------------Toggle this block to see the M dissapear-----------
  Serial.print("Initializing SD card...");
  if (!SD.begin(5)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

  myFile = SD.open("DATA.TXT");
  //-------------Toggle this block------------
 
  
  inputString[0] = 'a';
  inputString[1] = 'b';
  inputString[2] = 'c';


  Serial.print("inputString: ");
  Serial.println(inputString);
}

Почему это происходит и как я могу заставить последовательный монитор вести себя так, как ожидалось, с SD-картой.

, 👍1


1 ответ


Лучший ответ:

2
const int BUF_DIM = 3;

char inputString[BUF_DIM];
...

  inputString[0] = 'a';
  inputString[1] = 'b';
  inputString[2] = 'c';

...

  Serial.println(inputString);

Вы разрешили три символа в своем массиве и действительно поместили туда три символа, однако вы не поместили туда "нулевой терминатор" в конце (и нет места для него), поэтому вы, естественно, получите мусор в конце строки, пока процессор не найдет байт 0x00.

Другими словами, как код знает, что нужно напечатать три символа, а не 20 символов? Ответ заключается в том, что базовая функция (Serial.println в данном случае) ищет нулевой терминатор.

Вам нужно прочитать о том, как работают строки с нулевым окончанием.

,

Ах да inputString[2] = '\0'; исправлена проблема. Не знал о нуль-терминаторах. Спасибо!, @Dashiell Rose Bark-Huss