Как отображать текст на OLED?

Я пытаюсь распечатать информацию, полученную от другого ESP32 трансивером CAN, на OLED. Шина CAN работает отлично, так как уже получено «HELLO WORLD». Но я не могу распечатать полученное «HELLO WORLD» на OLED (также работает OLED). Код показан ниже,

#include <CAN.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // Ширина OLED-дисплея в пикселях
#define SCREEN_HEIGHT 32 // Высота OLED-дисплея в пикселях

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);
  while (!Serial);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);

  Serial.println("CAN Receiver");
  CAN.setPins(16, 17);
  // запускаем CAN-шину на скорости 500 кбит/с
  if (!CAN.begin(500E3)) {
    Serial.println("Starting CAN failed!");
    while (1);
  }
}

void loop() {
  // пытаемся разобрать пакет
  int packetSize = CAN.parsePacket();

  if (packetSize) {
    // получил пакет
    Serial.print("Received ");

    if (CAN.packetExtended()) {
      Serial.print("extended ");
    }

    if (CAN.packetRtr()) {
      // Запрос удаленной передачи, пакет не содержит данных
      Serial.print("RTR ");
    }

    Serial.print("packet with id 0x");
    Serial.print(CAN.packetId(), HEX);

    if (CAN.packetRtr()) {
      Serial.print(" and requested length ");
      Serial.println(CAN.packetDlc());
    } else {
      Serial.print(" and length ");
      Serial.println(packetSize);

      // только печатать данные пакета для не-RTR пакетов
      while (CAN.available()) {
        Serial.print((char)CAN.read());
      }
      Serial.println();
    }

    Serial.println();
  }
  delay(5000);

  display.clearDisplay();

  display.print((char)CAN.read());

  display.display();
}

, 👍1

Обсуждение

Чтобы отобразить код в вопросе, отредактируйте свой вопрос, выделите весь сегмент кода и нажмите кнопку "{}". Потенциальным участникам будет намного легче прочитать его и ответить на ваш вопрос., @JRobert

пожалуйста, отформатируйте код... используйте кнопку {} или поставьте ` до и после кода, @jsotola

Просим ли мы Ноя исправить форматирование своего сообщения, чтобы он научился публиковать вопрос, содержащий отформатированный код, а не редактировать свой вопрос и делать форматирование за него?, @Duncan C

@DuncanC - noah - «Новый участник», поэтому возможно, что один из наших пользователей пытался быть милым и помочь им. Stack Exchange поощряет редактирование и улучшение вопросов и ответов, и за их редактирование присуждается 3 уровня «значков». Пользователи с репутацией менее 1000 получают 2 репутации за редактирование вопроса. Я знаю одного пользователя Arduino SE, который имеет более 500 репутаций и никогда не задавал и не отвечал ни на один вопрос. Я согласен с вами насчет преподавания, но я также должен быть «хорошим», и давайте не будем забывать о тех трудолюбивых волонтерах, которые редактируют вопросы, чтобы сделать наш сайт лучше., @VE7JRO

@ VE7JRO, у меня возник соблазн применить редактирование самостоятельно, но я этого не сделал, потому что мне было интересно, являются ли предложения «пожалуйста, отформатируйте свой вопрос кодом» моментами «научите пользователя публиковать». Я новичок на сайте Arduino, но у меня более 100 тыс. представителей на Stack Overflow, поэтому я хорошо знаком с тем, как работает Stack Exchange., @Duncan C

Просто предположил, но мне кажется, что вы читаете сообщение CAN и печатаете его символ за символом в консоль Serial, но вы не сохраняете эти символы в буфере, поскольку вы получаете их из CAN.read(). Поэтому, когда вы затем пытаетесь display.print((char)CAN.read()); в этот момент больше нет доступных символов для CAN.read() для чтения, поэтому ничего не печатается дисплей.печать(). Хотя я только предполагаю., @Richard Chambers

@RichardChambers Спасибо, приятель! ты спасаешь мою жизнь., @noah

@RichardChambers Попробуйте вставить свой ответ в качестве ответа ниже, чтобы Ной мог выбрать его как правильный ответ. Для тех сладких, сладких интернет-точек;) (и потому, что тогда этот вопрос не будет отображаться в списке «без ответа»), @Ken Van Hoeylandt

@KenVanHoeylandt Спасибо за заметку. Я просто не подумал об этом., @Richard Chambers


1 ответ


3

Просто догадываюсь, но мне кажется, что вы читаете сообщение CAN и печатаете его посимвольно в консоль Serial, но не сохраняете эти символы в буфере, поскольку получаете их из CAN.read().

Поэтому, когда вы затем попытаетесь display.print((char)CAN.read()); в этот момент больше не будет доступных символов для CAN.read() для чтения, чтобы display.print() ничего не печатал.

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

,