Множественное объявление

Тема в разделе "Arduino & Shields", создана пользователем Kot26ru, 13 май 2021.

  1. AlexU

    AlexU Гуру

    Так я и глянул, в отличии от Вас.
    И там чёрным по белому написано, что декларации функций по-умолчанию имеют модификатор 'extern' и его явное указание дополнительного смысла ни какого не несёт.
    Но если Вам нравиться делать лишнюю работу, то -- пожалуйста.
    Не надо мешать шаблоны функций и декларации функций -- это совершенно разные понятия.
    Не помешает, но и не поможет.
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Ну, раз глянули, то глянули. Вам жить :)
     
    Andrey12 нравится это.
  3. Kot26ru

    Kot26ru Гик

    столкнулся со следующей проблемой - не проходит инициализация MFRC522. В мониторе порта должна появится надпись "Жду карту". Так вот ее нету. Файлы прилагаю
    Код (C++):
    #ifndef TXRX
    #define TXRX
    #include <Arduino.h>
    #include "rfid.h"

    Rfid rfid;

    void setup()
    {
      Serial.begin(115200);
      SPI.begin();
      Serial.println("Жду карту");
    }

    void loop()
    {

    }

    #endif
    Код (C++):
    #ifndef RFID_H_
    #define RFID_H_
    #include <Arduino.h>
    #include <SPI.h>                  // Библиотека для работы с шиной SPI
    #include <MFRC522.h>              // Библиотека для работы с RFID

    #define PIN_SS 10                 // вывод SS Ардуино для RFID
    #define PIN_RST 9                 // вывод RST Ардуино для RFID

    class Rfid
    {
      private:

      public:

        Rfid();                        // конструктор
    //    ~Rfid();                       // деструктор
    };
    #endif
    Код (C++):
    #include "rfid.h"

    MFRC522 mfrc522(PIN_SS, PIN_RST);

    Rfid::Rfid()
    {
      mfrc522.PCD_Init();
    }
    p.s. Деструктор закоментил ибо если оставить - ошибка компиляции вылазит.
    библу MFRC522 брал тут https://iarduino.ru/file/191.html
    стандартные примеры из библиотеки запускал - все работает. а при попытке засунуть в класс - не хочет
     
    Последнее редактирование: 15 май 2021
  4. Asper Daffy

    Asper Daffy Иксперд

    Ты пытаешься вызвать mfrc522.PCD_Init(); до инициализации среды ардуино. Как и в прошлый раз, ты выложил не те файлы, потому я не знаю, что она делает и для чего её среда обязательно нужна.

    Возможно, достаточно перед вызовом PCD_Init, поставить инициализацию. SPI, но, не видя что там - это кофейная гуща.
     
    Последнее редактирование: 15 май 2021
    SergeiL и Andrey12 нравится это.
  5. Kot26ru

    Kot26ru Гик

    точно, SPI инициализацию перенес перед созданием и инициализацией mfrc522 - заработало, спасибо!
     
  6. Kot26ru

    Kot26ru Гик

    Помогите подружить gps-модуль neo-8m и RFid-модуль mfrc522. По отдельности они работают. При объединении в одном коде gps перестает передавать информацию. Код прилагаю:
    Код (C++):
    #include <SPI.h>                  // Библиотека для работы с шиной SPI
    #include <Wire.h>                 // Библиотека для работы с шиной 1-Wire
    #include <TinyGPS++.h>            // Библиотека для работы с GPS
    #include <SoftwareSerial.h>       // Библиотека для работы с посл. портом
    #include <MFRC522.h>              // Библиотека для работы с RFID
    #define GPSBaud 9600              // скорость чтения GPS

    #define PIN_RX_GPS 3              // вывод Ардуино Тx для связи с GPS
    #define PIN_TX_GPS 2              // вывод Ардуино Rx для связи с GPS
    #define PIN_SS 10                 // вывод SS Ардуино для RFID
    #define PIN_RST 9                 // вывод RST Ардуино для RFID

    #include <LiquidCrystal_I2C.h>        // Библиотека для работы с ЖКИ
    LiquidCrystal_I2C lcd(0x27, 20, 4);   // создаем ЖКИ 20х4

    #define lsd_GPS \
      lcd.setCursor(0,0); \
      lcd.print("Satel:"); \
      lcd.print(gps.satellites.value()); \
      lcd.setCursor(0,1); \
      lcd.print("GPS_Lat:"); \
      lcd.print(gps.location.lat()); \
      lcd.setCursor(0,2); \
      lcd.print("GPS_Long:"); \
      lcd.print(gps.location.lng());


    TinyGPSPlus gps;                              // создаем GPS
    SoftwareSerial ss(PIN_RX_GPS, PIN_TX_GPS);    // создаем порт Rx/Tx
    MFRC522 mfrc522(PIN_SS, PIN_RST);             // создаем RFID

    byte uidDec, uidDecTemp;

    void setup() {

      ss.begin(GPSBaud);                  // Инициализация порта Rx/Tx
      SPI.begin();                        // Инициализация шины SPI
      mfrc522.PCD_Init();                 // Инициализация RFID
      Serial.begin(115200);               // Инициализация серийного порта для отладки
      lcd.init();                         // Инициализация ЖКИ
      lcd.clear();                        // Очистка экрана ЖКИ
      lcd.backlight();                    // Включаем подсветку
      Serial.println("Жду карту");
    }

    void loop() {
      unsigned long start = millis();
      do
      {
        while (ss.available())
          gps.encode(ss.read());
      }
      while (millis() - start < 1100);

      lsd_GPS;

      lcd.setCursor(11, 0);
      lcd.print("UID:");
      lcd.print(uidDec);

      if ( ! mfrc522.PICC_IsNewCardPresent()) {
        uidDec = 0;
        return;
      }
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
      uidDec = 0;
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {
        uidDecTemp = mfrc522.uid.uidByte[i];
        uidDec = uidDec * 256 + uidDecTemp;
      }
    }

    Методом исключения удалось определить строку, которая "отрубает" gps. Это mfrc522.PCD_Init(). Если ее закоментить - gps снова начинает видеть спутники. Но перестает работать RFid, так как модуль не инициализируется. Помогите подружить эти модули.
     
  7. Kot26ru

    Kot26ru Гик

  8. Asper Daffy

    Asper Daffy Иксперд

    В приведённых Вам ссылках нет файла <TinyGPS++.h>. Вы что-то напутали со ссылками. Приведите нормальные ссылки на библиотеки.

    Кроем того. Если Вам нужна помощь, Вы должны что-то делать сами - невозможно помочь тому, кто ничего не делает.

    Поэтому, сделайте следующее

    1. Вы бросьте нахрен LDC. Что он у Вас делает? Усложняет программу и прячет проблему под ворохом ненужностей? Выбросьте. Всю печать гоните в Serial. Запомните, с этого ВСЕГДА начинайте! Если возникла непонятная проблема - выбросить всё лишнее, что отвлекает и нагромождает. Чем меньше всякого барахла, тем легче разбираться.

    2. Приложите лог Serial'а для обоих случаев (для открытой инициализации, и для закомментированной). Хоть посмотреть, что там делается.
     
    Последнее редактирование: 29 май 2021
  9. Kot26ru

    Kot26ru Гик

    Спасибо, что откликнулись :)
    1. LCD выкинуть не могу, ибо он у меня показывать отладочную информацию, которую не всегда возможно вывести в сериал (там где ловит gps там нет компа, а там где есть комп - не видно спутников).
    2. Проблема конфликта SPI и SoftwareSerial не только моя головная боль как оказалось. Нашел несколько постов о этой проблеме и путь решения.
    3. Я тестирую всегда сначала работоспособность каждого модуля в отдельности. Проблемы начинаются именно при объединении нескольких модулей в одном коде.
     
  10. Kot26ru

    Kot26ru Гик

    tinygps++
     

    Вложения:

  11. Asper Daffy

    Asper Daffy Иксперд

    Так вот и идите дальше - тестируйте связки модулей, а не всё в куче.
    Т.е. проблема решена и больше Вам помощь не нужна?
     
  12. parovoZZ

    parovoZZ Гуру

    раз есть такая проблема, значит надо взять МК, у которого достаточное количество портов SPI и UART.
     
  13. Kot26ru

    Kot26ru Гик

    нет, проблема осталась. При попытке "внедрить" компилятор снова ругается на множественное определение:
    Код (C++):
    libraries\AltSoftSerial-1.4.0\AltSoftSerial.cpp.o (symbol from plugin): In function `AltSoftSerial::read()':
    (.text+0x0): multiple definition of `__vector_11'

    sketch\resiver_radio_GPS_LED_encoder_RFD_speaker_Altserial.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
    collect2.exe: error: ld returned 1 exit status
    exit status 1
    Ошибка компиляции для платы Arduino Nano.
     
    перекопал всю библиотеку Altserial. Не пойму что такое `__vector_11'. Нет такого нигде. В функции AltSoftSerial::read() уж точно нет такого параметра. Пробовал приписать extern - не помогло:( Помогите пожалуйста Библиотека AltSoftSerial
     

    Вложения:

  14. Feofan

    Feofan Нерд

    Код изменили? Выкладывайте.
     
  15. Kot26ru

    Kot26ru Гик

    да я уже незнаю как бороться. 2 варианта кода сделал - с классами и без. А ошибка одна и та же
     
  16. Kot26ru

    Kot26ru Гик

    это без классов
     

    Вложения:

  17. Kot26ru

    Kot26ru Гик

    это с классами
     

    Вложения:

  18. Feofan

    Feofan Нерд

    Ошибка: <libraries\__AltSoftSerial-1.4.0\AltSoftSerial.cpp.o (symbol from plugin): In function `AltSoftSerial::read()':
    (.text+0x0): multiple definition of `__vector_11'
    >
    Скетч из #36, строка #367 ISR(TIMER1_A). TIMER1_A растет из GyverTimers.h, строка #110.
    На сем мои познания закончились.
    P.S.
    Строка #249 объявлено ArtMessage art[1];
    Строка #251, for (int i = 0; i < PACK; i++), где PACK минимум 4-е, art выводится в этом цикле.
     
  19. SergeiL

    SergeiL Оракул Модератор

    Честно говоря малость умиляет меня код:
    Код (C++):
    #include <EEPROM.h>               // Библиотека для работы с EEPROM
    #include <microLED.h>             // Библиотека для работы с светодиодной лентой
    #include <avr/wdt.h>              // Библиотека для работы с вачдогом
    #include <SPI.h>                  // Библиотека для работы с шиной SPI
    #include <nRF24L01.h>             // Библиотека для работы с RF24
    #include <RF24.h>                 // Библиотека для работы с RF24
    #include <Wire.h>                 // Библиотека для работы с шиной 1-Wire
    #include <TinyGPS++.h>            // Библиотека для работы с GPS
    #include <AltSoftSerial.h>       // Библиотека для работы с посл. портом
    #include <GyverTimers.h>          // Библиотека для работы с таймером
    #include <GyverEncoder.h>         // Библиотека для работы с энкодером
    #include <MFRC522.h>              // Библиотека для работы с RFID

     
    Вот кто будет разбираться со со всем этим, кроме авторов и заинтересованных в этом коде?
    Почему не спросить на форуме автора?
     
  20. Asper Daffy

    Asper Daffy Иксперд

    А чего там понимать? Это имя вектора прерывания TIMER1_COMPA (ну, если у Вас ATMega328 - Вы же не сказали, что у Вас там)

    Либо у Вас в двух местах встречается

    ISR(TIMER1_COMPA_vect) {}

    Либо гивер эту функцию в .h файл загнал (с него станется), а Вы этот .h файл в два разных .cpp файла включили.

    Когда Вам говорят, что с кодами от гивера надо идти на его, гиверовский, сайт, а не выносить мозги людям на других ресурсах, - это не выпендрёж. В его кодах столько какашек, что разбираться с ними не хочет никто.