Ведение журнала всех вызовов 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
), похоже, не имеют общего интерфейса, даже если вызовы методов будут совместимы с исходным кодом.
@Nikita, 👍0
Обсуждение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
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- как отправить аргумент объектам ESP8266WebServer в функции
- Акцептант векселей ИКТ
- Arduino wrap или подкласс print() для работы с несколькими Serial
- Обеспечиваем более быстрое и точное обнаружение MindWave Mobile
- Самый прямой способ назначить байты Serial.read() массиву?
- Код CRC8 не работает должным образом
- Arduino + кодовые блоки C++
это чистый кодирующий вопрос, которому 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