Чтение текста с SD-карты возвращает странные символы

У меня есть электронная книга, преобразованная в файл .txt, сохраненный на SD-карте, подключенной к Arduino. Пытаюсь вывести слова из книги на ЖК-дисплей 16х2 по одному слову. В основном он работает, за исключением случаев, когда он читает слово с апострофом или символом вертикальной черты: оно не отображается правильно на ЖК-дисплее или последовательном выходе.

Например, слово "авторское" будет отображаться как «авторский»; (отредактируйте: на самом деле между «-» и «s» есть два поля, которые не отображаются на этом форуме) как на ЖК-дисплее, так и на последовательном выходе.

Я потратил целый день на решение этой проблемы, надеюсь, кто-то заметит ошибку:/

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

const int chipSelect = 53;

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

char nextChar;
String wordBuffer = "";

void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для собственного порта USB
  }
  Serial.print("Initializing SD card...");
  // проверяем, присутствует ли карта и может ли она быть инициализирована:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // больше ничего не делаем:
    while (1);
  }
  Serial.println("card initialized.");
  // открываем файл. обратите внимание, что одновременно может быть открыт только один файл,
  // поэтому вам придется закрыть этот файл, прежде чем открывать другой.
  File dataFile = SD.open("datalog.txt");
  if (dataFile) {
    while (dataFile.available()) {
      nextChar = dataFile.read();
      if (isWhitespace(nextChar)){
        lcd.print(wordBuffer);
        Serial.println(wordBuffer);
        lcd.display();
        delay(500);
        wordBuffer = "";
        lcd.clear();
      } else {
        wordBuffer = wordBuffer + nextChar;
        wordBuffer.trim();
      }
    }
    dataFile.close();
  } else {
    // если файл не открыт, выскочит ошибка:
    Serial.println("error opening datalog.txt");
  }
}

void loop() {
}

, 👍0

Обсуждение

Когда вы просматриваете файл .txt, ищете это слово и показываете его шестнадцатеричные значения, можете ли вы увидеть, обычный ли это код ASCII или что-то еще? Вы показываете эскиз, но я думаю, проблема в том, как электронная книга конвертируется в файл .txt., @Jot

Я проверил файл .txt, он в формате utf-8. Я использовал калибр, чтобы сохранить его как ascii, но теперь в текстовом документе многие буквы заменены вопросительными знаками. Преобразование в ascii на самом деле не сработает, если такие вещи, как апострофы, станут вопросительными знаками. возможно, я смогу найти другой формат, который подойдет., @Kara


1 ответ


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

3

Текстовый файл не ASCII, а UTF-8. Вам придется либо преобразовать его в чистый ASCII, либо написать (или получить) процедуру преобразования для аппроксимации символов UTF-8 с использованием ASCII на Arduino.

Возможно, это вам поможет.

,