Arduino Softwareserial говорит множественное определение векторов - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу, чтобы мой Arduino мог общаться с моим телефоном через Bluetooth. Я делал то же самое в прошлом, и это сработало. Мне это нужно для игры змеи на Arduino. Вот мой код

#include <SoftwareSerial.h>
#include <Otto9.h> //Ottova kniznica
#include <EnableInterrupt.h> 

#define RX 11
#define TX 10
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Otto9 Otto; //Toto je Otik XD
SoftwareSerial bluetooth(TX, RX);

void setup() {


  bluetooth.begin(9600);
  delay(500); 

}

void loop() {
  byte BluetoothData;
  if (bluetooth.available() > 0) {

    BluetoothData=bluetooth.read();

    // dekódování přijatého znaku
    switch (BluetoothData) {
      case '0':
        bluetooth.println("Vypni LED diodu.");
        break;
      case '1':
        bluetooth.println("Zapni LED diodu.");
        break;
    }
  }
  delay(100);
}

Не возражайте против посторонних вещей, это код из моего недавнего проекта.

Вот ошибка: * Arduino: 1.8.12 (Windows Store 1.8 .33.0) (Windows 10), Vývojová doska: "Arduino Nano, ATmega328P"

библиотеки \ SoftwareSerial \ SoftwareSerial. cpp .o (символ из плагина): в функции `SoftwareSerial :: read ( ) ':

(. Text + 0x0): множественное определение `__vector_3'

sketch \ KarOl-Alpha0-0-1.ino. cpp .o (символ из плагина) :(. text + 0x0): сначала определено здесь

библиотеки \ SoftwareSerial \ SoftwareSerial. cpp .o (символ из плагина): в функции `SoftwareSerial :: read () ':

(. text + 0x0): множественное определение `__vector_4 '

sketch \ KarOl-Alpha0-0-1.ino. cpp .o (символ из плагина) :(. text + 0x0): сначала определено здесь

библиотеки \ SoftwareSerial \ SoftwareSerial. cpp .o (символ из плагина): в функции `SoftwareSerial :: read () ':

(. text + 0x0): множественное определение `__vector_5 '

sketch \ Ka rOl-Alpha0-0-1.ino. cpp .o (символ из плагина) :(. text + 0x0): здесь впервые определено

collect2.exe: ошибка: ld вернул 1 состояние выхода

статус выхода 1

*

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Библиотеки SoftwareSerial и EnableInterrupt несовместимы.

Часто задаваемые вопросы по EnableInterrupt явно вызывают это и предлагают AltSoftSerial в качестве альтернативы. От https://github.com/GreyGnome/EnableInterrupt/wiki/FAQ#no действительно включаемая библиотека прерываний не работает с программным обеспечением последовательной библиотеки :

Нет на самом деле, библиотека EnableInterrupt не работает с библиотекой Software Serial.

Не используйте эту библиотеку. Используйте библиотеку Пола Стоффрегена AltSoftSerial по адресу https://github.com/PaulStoffregen/AltSoftSerial. Библиотека Software Serial (включая библиотеку NewSoftwareSerial), с одной стороны, связывает ваш процессор с задержками; кроме того, эти задержки находятся в пределах его ISR. ISR читает биты вне линии, читая весь байт (включая задержки) перед возвратом! Это ужасная практика для прерывания рутины. AltSoftSerial использует схему таймера ATmega. Он намного, намного более дружественен к процессору и позволяет вашей основной программе работать во время между последовательными переходами сигналов, что чаще всего происходит при последовательной передаче данных.

Если вам нужно использовать обе библиотеки, вы можете попытаться определить, какие порты использует EnableInterrupt. Это можно сделать, определив макросы EI_NOTPORTx.

См. https://github.com/GreyGnome/EnableInterrupt/wiki/SaveMemory#howto

В списке проблем EnableInterrupt есть некоторые обсуждения этой конкретной проблемы c. См https://github.com/GreyGnome/EnableInterrupt/issues/15 и https://github.com/GreyGnome/EnableInterrupt/issues/7

0 голосов
/ 22 апреля 2020

Это особенно вероятно, если вы используете несколько библиотек, особенно если одна из них - библиотека SoftwareSerial. Объяснение состоит в том, что разные библиотеки могут пытаться использовать один и тот же «ресурс», такой как прерывание смены контактов или таймер. Обходной путь не всегда прост. Например, если две библиотеки нуждаются в таймере 2, они оба не могут его иметь. Поэтому используйте либо HardwareSerial, либо найдите конфликт - так что, если он работал в более старой версии IDE (и стандартных библиотек), в нем могут быть серьезные изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...