Передача последовательного дампа в файл SD-карты

Я использую модуль RFID для чтения чипов NFC mifare, а в библиотеке есть только методы для отправки данных на последовательный монитор. Мне нужно, чтобы они были сохранены в файле SD-карты. Я добавлял в файлы библиотеки собственные методы для возврата строк, которые затем записывал на SD-карту, но это проблема; Должен быть более быстрый способ просто автоматически передать все данные, но я не знаю, как это сделать в cpp.

Вот пример функции для дампа в последовательный порт, который необходимо передать в файл на SD- карте.

void MFRC522::PICC_DumpDetailsToSerial(Uid *uid) {
    Serial.print(F("Card UID:"));
    for (byte i = 0; i < uid->size; i++) {
        if(uid->uidByte[i] < 0x10)
            Serial.print(F(" 0"));
        else
            Serial.print(F(" "));
        Serial.print(uid->uidByte[i], HEX);
    } 
    Serial.println();

    // САК
    Serial.print(F("Card SAK: "));
    if(uid->sak < 0x10)
        Serial.print(F("0"));
    Serial.println(uid->sak, HEX);

    // (рекомендуемый) тип PICC
    PICC_Type piccType = PICC_GetType(uid->sak);
    Serial.print(F("PICC type: "));
    Serial.println(PICC_GetTypeName(piccType));
} 

Спасибо!

, 👍0

Обсуждение

у arduino нет операционной системы, поэтому нет «конвейера», как в linux....... возможно, есть способ переопределить объект Serial, @jsotola


1 ответ


1

Пусть объекты MFRC522 запомнят, куда вы хотите, чтобы они отправляли выходные данные. добавив член данных в класс следующим образом:

private:
    Print &output;

Это ссылка на объект Печать, т. е. любой объект, где вы можете print() или println(). Эта ссылка должна быть инициализирована в конструктор, вот такой

MFRC522:MFRC522(...other arguments..., Print &my_output = Serial)
: ...other initializations..., output(my_output)
{
    ...constructor body...
}

Обратите внимание, что по умолчанию вывод инициализируется как ссылка на Серийный. Таким образом, если вы явно не попросите, чтобы вывод был выполнен в другом месте класс будет вести себя так же, как и раньше.

Последний шаг — изменить в реализации класса каждый ссылка на Serial по output. Это просто глобальная находка и заменить.

На этом этапе класс MFRC522 можно использовать точно так же, как и раньше, и он будет вести себя одинаково. Это означает, что каждый пользователь библиотеки ваша модифицированная версия должна быть в состоянии использовать без проблем. я таким образом рекомендуем вам отправить изменения первоначальному автору, чтобы они есть шанс быть включенным в каноническую версию библиотека.

Теперь, если вы хотите, чтобы эти выходные данные отладки были отправлены в другое место, просто укажите пункт назначения в качестве последнего аргумента конструктора:

MFRC522 my_RFID_module(...other arguments..., my_SD_card_file);

Пока пункт назначения является экземпляром виртуального класса Print (в принципе, все, что вы можете print(), должно быть в порядке), это должно работать как и ожидалось.

,