Как заставить std::cout писать в Serial?

serial mkr1010 stl

Я использую 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?

, 👍6

Обсуждение

Может быть, попробовать использовать препроцессор, создав предложение #define? Это может сработать. Что-то вроде [этого](https://stackoverflow.com/questions/17180974/define-printmsg-stdcout-msg-stdendl), но наоборот. На самом деле это не «запись в последовательный порт», но, по крайней мере, так будет выглядеть, когда вы читаете код., @Filip Franik

MKR1010 — это SAMD21G, который представляет собой Cortex M0. но он также использует реализацию ARM stdio, @Juraj

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0475m/chr1358938931411.html, @Majenko


1 ответ


5

Библиотеки 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