Как заставить std::cout писать в Serial?
Я использую Arduino MKR WiFi 1010, плату SAMD ARM Cortex M3. Я часто полагаюсь на стандартную библиотеку, используя такие вещи, как std::vector<>
и std::string
. Я также хочу использовать std::cout
. Мне удалось сделать это на UNO R3 с помощью библиотеки ArduinoSTL, но эта библиотека не работает и не нужна на MKR WiFi 1010, потому что в платформу встроены все стандартные библиотеки.
Однако на MKR WiFi 1010 я не могу заставить std::cout
производить какой-либо вывод. Я предполагаю, что на самом деле он ни к чему не подключен.
Я хочу, чтобы std::cout
выполнял запись в Serial
(который имеет псевдоним SerialUSB
, который имеет тип Serial_
).
Есть ли способ заставить std::cout
выполнять запись в поток Serial
?
@Tim Long, 👍6
Обсуждение1 ответ
Библиотеки ARM gcc предлагают простой способ перенаправления стандартных выходных данных. Достаточно реализовать функцию _write(int fd, char *ptr, int len)
, и она заменит реализацию по умолчанию, используемую в библиотеке, чтобы направить стандартный вывод на полухостинг отладчика. Для соответствия функция должна быть скомпилирована как C.
#include <Arduino.h>
#undef max
#undef min
#include <stdio.h>
#include <iostream>
using namespace std;
extern "C" {
int _write(int fd, char *ptr, int len) {
(void) fd;
return Serial.write(ptr, len);
}
}
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("START");
printf("HERE WE ARE\r\n");
cout << "TEST COUT\r\n";
cerr << "TEST ERR\r\n";
}
void loop() {
}
#undefs
отменяет определение макросов Arduino, которые конфликтуют с включениями, используемыми в <iostream>
мне потребовалось много часов, чтобы заставить его работать, и, в конце концов, это так просто, @Juraj
@TimLong, помог ли ответ?, @Juraj
Hy Спасибо, что поделились. Это не работает для меня. Плата Arduion IDE 1.8.19, Mega2560 и DUE. iostream не найден. Я сделал некоторые поиск в сети. И похоже, что stl не поддерживается на Arduino, но я нашел несколько альтернатив: например, Silver-Fang/ArduinoSTL на Github., @MajorLee6695
@MajorLee6695, вопрос был о платформе SAMD (плата MKR), @Juraj
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Может быть, попробовать использовать препроцессор, создав предложение
#define
? Это может сработать. Что-то вроде [этого](https://stackoverflow.com/questions/17180974/define-printmsg-stdcout-msg-stdendl), но наоборот. На самом деле это не «запись в последовательный порт», но, по крайней мере, так будет выглядеть, когда вы читаете код., @Filip FranikMKR1010 — это SAMD21G, который представляет собой Cortex M0. но он также использует реализацию ARM stdio, @Juraj
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0475m/chr1358938931411.html, @Majenko