Определение нескольких символов, связанных с USART_RX_vect из Serial

При попытке скомпилировать приведенный ниже скетч я получаю следующую ошибку при использовании IDE или CLI:

HardwareSerial0.cpp.o (symbol from plugin): 
In function `Serial':
(.text+0x0): multiple definition of `__vector_18'

Похоже, это как-то связано с несколькими определениями USART_RX_vect.

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

Скетч:

// Прослушиваем последовательный порт для получения инструкций и печати значений регистров

volatile boolean start = false;  // флаг для начала проверки регистра; Глобальный

void setup() {
  Serial.begin(9600);
  if (Serial) {
    Serial.println("Arduino listening...");
    Serial.println("Enter g or s at any time");  // g = идти, s = стоп
  }
}

void loop() {
  while (start) {
    // распечатываем значения некоторых регистров АЦП
    Serial.print("ADMUX  register: ");
    print_bin(ADMUX);
    Serial.print("ADCSRA register: ");
    print_bin(ADCSRA);
    Serial.println(" ");
    delay(1000);
  }
}

ISR(USART_RX_vect) {
  unsigned char data;
  data = UDR0;
  if (data == 'g') {
    start = true;
  }
  if (data == 's') {
    start = false;
  }
}

void print_bin(byte aByte) {
  for (int8_t aBit = 7; aBit >= 0; aBit--) {
    if (aBit == 3) {
      Serial.print(" ");
    }
    Serial.print(bitRead(aByte, aBit) ? '1' : '0');
  }
  Serial.println(" ");
}

Использование Arduino IDE следующим образом:
Версия: 2.3.0
Дата: 2024-02-07T13:40:21.377Z
Версия CLI: 0.35.2

, 👍1

Обсуждение

Ну, Serial, вероятно, использует тот же ISR. (может отличаться для разных плат, однако Arduino Core обычно занимает все соответствующие ISR для всех последовательных портов), @KIIV


1 ответ


Лучший ответ:

2

USART_RX_vect определяется базовой библиотекой Arduino. Это часть реализация объекта Serial. У твоего скетча есть второй определение того же ISR, отсюда и конфликт.

По сути, у вас есть два варианта: либо вы пишете собственный код для обработки последовательный порт на уровне регистра ввода-вывода (как в вашем ISR выше) или вы полагаетесь на Serial реализацию ядра Arduino (Serial.available() и Serial.read() для чтения данных). Вы не можете смешивать такие подходы, как вы пытаетесь сделать здесь.

,

Спасибо, рана, нанесенная самому себе. В другом эскизе я использовал ISR(ADC_vect) без такого конфликта, но я предполагаю, что он не реализован в основной библиотеке. Живи и учись., @Bryan Hanson

@BryanHanson: Действительно. Ядро занято и ожидает АЦП (в analogRead()) вместо использования прерывания., @Edgar Bonet