Неожиданный символ добавляется в буферный массив 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 ответ
Лучший ответ:
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 в данном случае) ищет нулевой терминатор.
Вам нужно прочитать о том, как работают строки с нулевым окончанием.
- Float печатается только 2 десятичных знака после запятой
- Почему запуск последовательного монитора перезапускает скетч?
- Чтение из Serial
- Связь последовательного порта Digispark
- Работает ли конструкция int array[100] = {0} на Arduino?
- Длина константного массива uint8_t*
- Как получить правильный последовательный порт?
- Как удалить элемент из массива arduino?
Ах да
inputString[2] = '\0';
исправлена проблема. Не знал о нуль-терминаторах. Спасибо!, @Dashiell Rose Bark-Huss