Определение нескольких символов, связанных с 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
@Bryan Hanson, 👍1
Обсуждение1 ответ
Лучший ответ:
USART_RX_vect
определяется базовой библиотекой Arduino. Это часть
реализация объекта Serial
. У твоего скетча есть второй
определение того же ISR, отсюда и конфликт.
По сути, у вас есть два варианта: либо вы пишете собственный код для обработки
последовательный порт на уровне регистра ввода-вывода (как в вашем ISR выше) или
вы полагаетесь на Serial
реализацию ядра Arduino
(Serial.available()
и Serial.read()
для чтения данных). Вы не можете смешивать
такие подходы, как вы пытаетесь сделать здесь.
Спасибо, рана, нанесенная самому себе. В другом эскизе я использовал ISR(ADC_vect) без такого конфликта, но я предполагаю, что он не реализован в основной библиотеке. Живи и учись., @Bryan Hanson
@BryanHanson: Действительно. Ядро занято и ожидает АЦП (в analogRead()
) вместо использования прерывания., @Edgar Bonet
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Ну, Serial, вероятно, использует тот же ISR. (может отличаться для разных плат, однако Arduino Core обычно занимает все соответствующие ISR для всех последовательных портов), @KIIV