Два SoftwareSerial, как подружить?

Тема в разделе "Arduino & Shields", создана пользователем 5diezov, 24 апр 2019.

  1. 5diezov

    5diezov Нерд

    Нужно подключить к uno gps и sim800.
    По отдельности все работает, что бы использовать два сериала воспользовался примером из https://www.arduino.cc/en/Tutorial/TwoPortReceive
    Но когда добавляю в код для второго порта, данные с первого перестают приниматься.
    Если удалить блок ===============serial2 в функции loop, все работает.
    В чем затык?
    Код (C++):
    #include <TroykaGPS.h>
    #include <SoftwareSerial.h>

    SoftwareSerial GPSport(10, 11);
    SoftwareSerial portTwo(8, 9);

    // serial-порт к которому подключён GPS-модуль
    #define GPS_SERIAL    GPSport
    // создаём объект класса GPS и передаём в него объект GPS_SERIAL
    GPS gps(GPS_SERIAL);
    // задаём размер массива для времени, даты, широты и долготы
    #define MAX_SIZE_MASS 16
    // массив для хранения текущего времени
    char strTime[MAX_SIZE_MASS];
    // массив для хранения текущей даты
    char strDate[MAX_SIZE_MASS];
    // массив для хранения широты в градусах, минутах и секундах
    char latitudeBase60[MAX_SIZE_MASS];
    // массив для хранения долготы в градусах, минутах и секундах
    char longitudeBase60[MAX_SIZE_MASS];



    //------------------------------------------------------------------SETUP
    void setup() {
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }


    // открываем Serial-соединение с GPS-модулем на скорости 115200 бод
      GPS_SERIAL.begin(115200);
      // печатаем строку
      Serial.println("GPS init is OK on speed 115200");
      // изменяем скорость обещение GPS-модуля с управляющей платой на 9600 бод
      // используем NMEA-команду «$PMTK251,9600*17\r\n»
      GPS_SERIAL.write("$PMTK251,9600*17\r\n");
      // закрываем Serial-соединение с GPS-модулем
      GPS_SERIAL.end();
      // открываем Serial-соединение с GPS-модулем на скорости 9600 бод
      GPS_SERIAL.begin(9600);
      // печатаем строку
      Serial.print("GPS init is OK on speed 9600");


      portTwo.begin(9600);
    }

    //------------------------------------------------------------------LOOP
    void loop() {

    gps_get();
      delay(5000);

      //==================================================serial2
      // Теперь прослушиваем второй порт:
      portTwo.listen();
      Serial.println("Data from port two:");
      while (portTwo.available() > 0) {
        char inByte = portTwo.read();
        Serial.write(inByte);
      }
      delay(5000);
      //==================================================serial2

     
      Serial.println();
    }





    //------------------------------------------------------------------GET GPS
    void gps_get()  
    {
       GPSport.listen();
      // если пришли данные с gps-модуля
      if (gps.available()) {
        // считываем данные и парсим
        gps.readParsing();
        // проверяем состояние GPS-модуля
        switch(gps.getState()) {
          // всё OK
          case GPS_OK:
            Serial.println("GPS is OK");
            // выводим координаты широты и долготы
            // 1. в градусах, минутах и секундах
            // 2. градусах в виде десятичной дроби
            Serial.println("GPS Coordinates: ");
            gps.getLatitudeBase60(latitudeBase60, MAX_SIZE_MASS);
            gps.getLongitudeBase60(longitudeBase60, MAX_SIZE_MASS);
            Serial.print("Latitude\t");
            Serial.print(latitudeBase60);
            Serial.print("\t\t");
            Serial.println(gps.getLatitudeBase10(), 6);
            Serial.print("Longitude\t");
            Serial.print(longitudeBase60);
            Serial.print("\t\t");
            Serial.println(gps.getLongitudeBase10(), 6);
            // выводим количество видимых спутников
            Serial.print("Sat: ");
            Serial.println(gps.getSat());
            // выводим текущую скорость
            Serial.print("Speed: ");
            Serial.println(gps.getSpeedKm());
            // выводим высоту над уровнем моря
            Serial.print("Altitude: ");
            Serial.println(gps.getAltitude());
            // выводим текущее время
            Serial.print("Time: ");
            gps.getTime(strTime, MAX_SIZE_MASS);
            gps.getDate(strDate, MAX_SIZE_MASS);
            Serial.write(strTime);
            Serial.println();
            // выводим текущую дату
            Serial.print("Date: ");
            Serial.write(strDate);
            Serial.println("\r\n");
            // каждую переменную дату и времени можно выводить отдельно
      /*    Serial.print(gps.getHour());
            Serial.print(gps.getMinute());
            Serial.print(gps.getSecond());
            Serial.print(gps.getDay());
            Serial.print(gps.getMonth());
            Serial.print(gps.getYear());
      */
     
            break;
          // ошибка данных
          case GPS_ERROR_DATA:
            Serial.println("GPS error data");
            break;
          // нет соединение со спутниками
          case GPS_ERROR_SAT:
            Serial.println("GPS no connect to satellites!!!");
            break;
        }
      }
    }
     
  2. Airbus

    Airbus Радиохулиган

    А зачем два?Один не справляется?
     
  3. Daniil

    Daniil Гуру

    Лучше работать с мегой, если вам нужны сериалы. Вы не знаете как реализованы программные и какие там ошибки и, чем больше, тем больше вероятность проблем
     
    Последнее редактирование: 24 апр 2019
    Vovka и parovoZZ нравится это.
  4. parovoZZ

    parovoZZ Гуру

    бери МК с двумя аппаратными сериалами. Софтварный сериал - это какое-то убогое изобретение абдурины.
     
    Daniil и Airbus нравится это.
  5. Airbus

    Airbus Радиохулиган

    Ну и не Ардуины это изобретение если что.А задолго до того.Для Тини-13 например.Или для Т-45.Но аппаратный по любому лучше.
     
    Andrey12 нравится это.
  6. 5diezov

    5diezov Нерд

    Всем спасибо, мысль понял, будем копать хардвар сериалы.
     
    Daniil нравится это.
  7. parovoZZ

    parovoZZ Гуру

    Attiny441/841 бери и наслаждайся.