Ведение журнала всех вызовов Serial.print на устройстве

Моя программа Arduino производит отладку/вывод ошибок, используя такие методы, как Serial.printf. Я могу видеть весь этот вывод, когда он подключен к компьютеру, но я также хочу записать весь этот же вывод на SD-карту моей платы, чтобы я мог прочитать его позже, после того как мой Arduino закончится в полевых условиях, без подключения к компьютеру.

На моей плате Feather M0 установлена SD-карта, и я уже записываю на нее другие данные с помощью библиотеки SdFat. Эта часть в порядке.

Чего я не могу понять, так это как эффективно записывать один и тот же текст как на SD-карту, так и на последовательный вывод. Я имею в виду, без излишней шаблонности. Обычно это было бы несложно, просто создайте такой метод, как: (псевдокод)

void logStuff(char text[]) {
  Serial.print(text);
  sdFatFile.print(text);
}

Однако вызов такой функции в C-это много шаблонного. Например, в случае printfмне понадобится что-то подобное каждый раз, когда я захочу записать один фрагмент текста:

char text[100];
sprintf(text, "line to log %d", someNumber);
logStuff(text);

Что является слишком большой церемонией для вызовов отладки, разбросанных по всему моему приложению.

В идеале я хотел бы реализовать что-то вроде этого:

void logStuff(char format[], ...varargs) {
  Serial.printf(format, ...varargs);
  sdFatFile.printf(formar, ...varargs);
}

Который вы могли бы назвать точно так же, как вы назвали бы Serial.printf, но я не знаю, возможно ли это реализовать в C/C++.

Обратите внимание, что также было бы приемлемо, если бы мой код регистрировался ЛИБО в последовательном, либо в sdFatFile – то есть только в одном целевом файле, а не в обоих одновременно – в зависимости от того, подключен Arduino или нет. Но я также не уверен, как это сделать, типы, для которых я буду вызывать printf (SdFile vs Serial), похоже, не имеют общего интерфейса, даже если вызовы методов будут совместимы с исходным кодом.

, 👍0

Обсуждение

это чистый кодирующий вопрос, которому 50 лет., @Juraj

Не моя вина, что Arduino использует язык программирования 50-летней давности, @Nikita

это функция printf, которую вы используете: https://github.com/adafruit/ArduinoCore-samd/blob/master/cores/arduino/Print.cpp#L225, @Juraj

В Интернете есть много знаний о вещах 50-летней давности. и сайты стека требуют исследования, прежде чем спрашивать, @Juraj

Я знаю, как использовать функцию printf, это не то, о чем мой вопрос. Вопрос конкретно касается печати на два интерфейса arduino, SdFile и последовательный. В Интернете есть много вещей, но у него нет ответа на этот вопрос, ни на SO, ни где-либо еще., @Nikita

существует точный способ реализации " void logStuff(формат символов[], ...varargs) {`. что еще непонятно?, @Juraj

Теперь, когда вы упомянули, почему вы указали мне на эту ссылку, все ясно. Я прочитал ваш предыдущий комментарий как просто указание мне использовать функцию printf, что я уже делаю. Тем не менее, это дает мне ответ, так что спасибо вам. Я бы хотел, чтобы это было в обычном формате вопросов и ответов, а не... это., @Nikita

вопросы чистого кодирования не относятся к теме Arduino SE. и varargs на самом деле не являются темой Arduino. Создатели Arduino избегают printf и varargs. он доступен в последовательном режиме (класс печати) только потому, что Adafruit добавил его в свою версию ядра SAMD, @Juraj

вы можете использовать макросы, чтобы легко создать свою вспомогательную "функцию" или несколько перегруженных копий вашей функции logStuff, которая принимает различные общие формальные параметры., @dandavis


1 ответ


1

Что мне подходит

#include <SD.h> //Загрузить библиотеку SD-карт
#include<SPI.h> //Загрузить библиотеку SPI

void loop()
{
 Serial.print(tempSensor3);
//Open existing file on SD card named PTData.txt
mySensorData = SD.open("PTData.txt", FILE_WRITE);
  if (mySensorData) {
    mySensorData.print(tempSensor3);
    mySensorData.close();                    //закройте файл
  }
,

Вы показываете мне, как печатать в последовательном режиме, и отдельно, как печатать в файл. Я знаю, как делать обе эти вещи так, как ты показал. Чего я НЕ знаю, так это как это сделать в одной функции в стиле printf, которую я могу вызвать, чтобы печатать как в последовательный, так и в файл одновременно., @Nikita