Проблемы с SoftwareSerial, не могу разобраться. Помогите.

Тема в разделе "Микроконтроллеры AVR", создана пользователем Eygenio, 4 дек 2017.

  1. Eygenio

    Eygenio Нуб

    Добрый день. Суть вот какая: Есть стандартный скетч из библиотеки TinyGPS++, работает он хорошо, но при добавлении в код еще одного виртуального Serial, и запуска его, данные с GPS перестают идти. Пробовал делать запуск порта в начале кода и по окончанию закрытие, прерывания через delay, думал может что с библиотеками, но ни в какую данные не идут. Мне кажется я что-то не понимаю, объясните в чем проблема. Первый код работает, а второй нет, причем данные GPS перестают идти при добавлении строки " bb.begin(9600);" . Почему? Все подключено к Arduino Nano
    Код (C++):
    #include <TinyGPS++.h>
    #include <SoftwareSerial.h>
    /*
       This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
       It requires the use of SoftwareSerial, and assumes that you have a
       4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
    */

    static const int RXPin = 4, TXPin = 3;
    static const uint32_t GPSBaud = 9600;

    // The TinyGPS++ object
    TinyGPSPlus gps;

    // The serial connection to the GPS device
    SoftwareSerial ss(RXPin, TXPin);

    void setup()
    {
      Serial.begin(9600);
      ss.begin(GPSBaud);
      Serial.println(F("DeviceExample.ino"));
      Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
      Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
      Serial.println(F("by Mikal Hart"));
      Serial.println();
    }

    void loop()
    {
      // This sketch displays information every time a new sentence is correctly encoded.
      while (ss.available() > 0)
        if (gps.encode(ss.read()))
          displayInfo();

      if (millis() > 5000 && gps.charsProcessed() < 10)
      {
        Serial.println(F("No GPS detected: check wiring."));
        while(true);
      }
    }

    void displayInfo()
    {
      Serial.print(F("Location: "));
      if (gps.location.isValid())
      {
        Serial.print(gps.location.lat(), 6);
        Serial.print(F(","));
        Serial.print(gps.location.lng(), 6);
      }
      else
      {
        Serial.print(F("INVALID"));
      }

      Serial.print(F("  Date/Time: "));
      if (gps.date.isValid())
      {
        Serial.print(gps.date.month());
        Serial.print(F("/"));
        Serial.print(gps.date.day());
        Serial.print(F("/"));
        Serial.print(gps.date.year());
      }
      else
      {
        Serial.print(F("INVALID"));
      }

      Serial.print(F(" "));
      if (gps.time.isValid())
      {
        if (gps.time.hour() < 10) Serial.print(F("0"));
        Serial.print(gps.time.hour());
        Serial.print(F(":"));
        if (gps.time.minute() < 10) Serial.print(F("0"));
        Serial.print(gps.time.minute());
        Serial.print(F(":"));
        if (gps.time.second() < 10) Serial.print(F("0"));
        Serial.print(gps.time.second());
        Serial.print(F("."));
        if (gps.time.centisecond() < 10) Serial.print(F("0"));
        Serial.print(gps.time.centisecond());
      }
      else
      {
        Serial.print(F("INVALID"));
      }

      Serial.println();
    }
    Код (C++):
    #include <TinyGPS++.h>
    #include <SoftwareSerial.h>
    /*
       This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
       It requires the use of SoftwareSerial, and assumes that you have a
       4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
    */

    static const int RXPin = 4, TXPin = 3;
    static const uint32_t GPSBaud = 9600;

    // The TinyGPS++ object
    TinyGPSPlus gps;

    // The serial connection to the GPS device
    SoftwareSerial ss(RXPin, TXPin);
    SoftwareSerial bb(6, 5);

    void setup()
    {
      Serial.begin(9600);
      ss.begin(GPSBaud);
      bb.begin(9600);
      Serial.println(F("DeviceExample.ino"));
      Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
      Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
      Serial.println(F("by Mikal Hart"));
      Serial.println();
    }

    void loop()
    {
      // This sketch displays information every time a new sentence is correctly encoded.
      while (ss.available() > 0)
        if (gps.encode(ss.read()))
          displayInfo();

      if (millis() > 5000 && gps.charsProcessed() < 10)
      {
        Serial.println(F("No GPS detected: check wiring."));
        while(true);
      }
    }

    void displayInfo()
    {
      Serial.print(F("Location: "));
      if (gps.location.isValid())
      {
        Serial.print(gps.location.lat(), 6);
        Serial.print(F(","));
        Serial.print(gps.location.lng(), 6);
      }
      else
      {
        Serial.print(F("INVALID"));
      }

      Serial.print(F("  Date/Time: "));
      if (gps.date.isValid())
      {
        Serial.print(gps.date.month());
        Serial.print(F("/"));
        Serial.print(gps.date.day());
        Serial.print(F("/"));
        Serial.print(gps.date.year());
      }
      else
      {
        Serial.print(F("INVALID"));
      }

      Serial.print(F(" "));
      if (gps.time.isValid())
      {
        if (gps.time.hour() < 10) Serial.print(F("0"));
        Serial.print(gps.time.hour());
        Serial.print(F(":"));
        if (gps.time.minute() < 10) Serial.print(F("0"));
        Serial.print(gps.time.minute());
        Serial.print(F(":"));
        if (gps.time.second() < 10) Serial.print(F("0"));
        Serial.print(gps.time.second());
        Serial.print(F("."));
        if (gps.time.centisecond() < 10) Serial.print(F("0"));
        Serial.print(gps.time.centisecond());
      }
      else
      {
        Serial.print(F("INVALID"));
      }

      Serial.println();
    }
     
  2. rkit

    rkit Гуру

    Потому что два софтовых сериала ардуино уже не тянет.
     
    NikitOS нравится это.
  3. Eygenio

    Eygenio Нуб

    А есть решение?
     
  4. Eygenio

    Eygenio Нуб

    А если один подцепит к Rx - 0 Tx - 1 заработает? Тогда правда с компа видно не будет, но это ладно. И как это в коде тогда указать?
     
  5. rkit

    rkit Гуру

    Есть другая какая-то библиотека, которая легковеснее. Если возможно, то можно уменьшить бодрейт. Иначе берите плату с большим количеством аппаратных сериалов.
    Serial
     
    Eygenio нравится это.
  6. Eygenio

    Eygenio Нуб

    Спасибо.
     
  7. NikitOS

    NikitOS Король шутов Администратор

    Решение есть! Arduino Mega
     
  8. b707

    b707 Гуру

    Поищите в гугле что-то типа "multiple software serial" - на забугорных сайтах обсуждалось подробно. Суть в том, что библиотека позволяет открывать одновременно только один софтовый последовательный порт. Если у вас несколько девайсов - к ним надо обращаться попеременно, прежде чем открыть новый - закрыть все остальные.