Почему в монитор порта не идет никакая информация?

Тема в разделе "Arduino & Shields", создана пользователем axet, 19 окт 2019.

  1. axet

    axet Нуб

    При попытке запуска этого
    Код (C++):
    #include <SoftwareSerial.h>
    #include <TinyGPS.h> //подключение необходимых для работы библиотек

    TinyGPS gps;
    SoftwareSerial gpsSerial(3, 4); //номера пинов, к которым подключен модуль (RX, TX)

    bool newdata = false;
    unsigned long start;
    long lat, lon;
    unsigned long time, date;

    void setup(){
    gpsSerial.begin(9600); // установка скорости обмена с приемником
    Serial.begin(9600);
    Serial.println("Waiting data of GPS...");
    }

    void loop(){

    if (millis() - start > 1000) //установка задержки в одну секунду между обновлением данных
    {
    newdata = readgps();
    if (newdata)
    {
    start = millis();

    gps.get_position(&lat, &lon);
    gps.get_datetime(&date, &time);
    Serial.print("Lat: "); Serial.print(lat);
    Serial.print(" Long: "); Serial.print(lon);
    Serial.print(" Date: "); Serial.print(date);
    Serial.print(" Time: "); Serial.println(time);
    }}
    }

    // проверка наличия данных

    bool readgps()
    {
    while (gpsSerial.available())
    {
    int b = gpsSerial.read();
    //в библиотеке TinyGPS имеется ошибка: не обрабатываются данные с \r и \n
    if('\r' != b)
    {
    if (gps.encode(b))
    return true;
    }
    }
    return false;
    }
    на Arduino Nano в монитор порта ничего не идет. GPS приемник тот же,пины RX и TX модуля вроде соединил правильно. Сам модуль проверил на более простом скетче,работает вроде. Как можно решить эту проблему?
    P.S. вот тот самый более простой скетч,при его запуске с RX на 3 и TX на 4 в монитор что-то шло.
    Код (C++):
    #include <SoftwareSerial.h>

    SoftwareSerial nss(3, 4);

    void setup(void) {
      Serial.begin(115200);
      nss.begin(9600);
      Serial.println("Fun begins:");
    }

    void loop(void) {
      if (nss.available()) Serial.write(nss.read());
    }
     
    Последнее редактирование: 20 окт 2019
  2. b707

    b707 Гуру

    вы предлагаете нам скачать чужой код по ссылке и разбираться в нем? - спросите авторов тех скетчей
     
    Asper Daffy нравится это.
  3. Asper Daffy

    Asper Daffy Иксперд

    А код где? Мы сами должны его по левым ссылкам выискивать?
     
  4. axet

    axet Нуб

    ошибку понял ,исправил. Прошу прощения
     
  5. b707

    b707 Гуру

    в первом коде, примерно на девятой строчке с конца, после строки
    int b = gpsSerial.read();
    вставьте оператор
    Serial.write((char)b);
    т посмотрите, что будет выдаваться в монитор
     
  6. axet

    axet Нуб

    скетч вашей строкой дополнил,RX TX по-прежнему на 3 и 4,монитор порта все равно молчит
    UPD: попробовал снова запустить второй скетч,запустил,но не заработало,поменял RX TX местами на пинах и пошел вывод, как это объяснить? (до этого было подключено ,как написал выше)
     
    Последнее редактирование: 20 окт 2019
  7. b707

    b707 Гуру

    RX TX всегда подключаются "крест-накрест" - RX модуля к TX ардуины и наоборот
     
    DetSimen нравится это.
  8. a1000

    a1000 Гуру

    Для соединения двух устройств по UART, а именно так вы соединяете свою Arduino и GPS модуль, используются две рабочие линии(не считая земли). Выходы, к которым они подключаются называются:
    TX - Trancieve (отправление), проще говоря передатчик
    RX - Recieve (получение), проще говоря приёмник
    Модули отправляет данные через передатчик (TX), а Arduino, что вполне логично, принимает их приёмником (RX). Вот так их и надо соединять TX модуля с RX Arduino, в вашем случае пин D3. Для обратной передачи (Arduino - GPS), второй линией соединяем TX Arduino (D4) с RX модуля. Так как в вашем случае Arduino только слушает модуль и ничего ему не передаёт, то вторая линия не обязательна.
     
  9. axet

    axet Нуб

    Спасибо за совет. Не знал про это. Но даже с учетом этого факта ,скетч первый ничего не выдает в монитор порта.
     
  10. b707

    b707 Гуру

    первый скетч с моей добавленной строкой или нет?
    если первый скетч с моей строкой ничего не печатает, а второй - что-то выдает - вы явно что-то напутали с подключением при переходе от одного кода к другому, так как с моей поправкой два эти кода должны выдавать практически одно и тоже
     
  11. a1000

    a1000 Гуру

    А ещё глупый вопрос - на GPS модуле всетодиодик моргает?
     
  12. axet

    axet Нуб

    да,моргает
     
  13. axet

    axet Нуб

    Специально ,чтобы избежать подобного,попробовал по-разному подключать. Результат одинаковый
     
  14. a1000

    a1000 Гуру

    А тестовые скетчи из библиотеки TinyGPS работают?
    ЗЫ: Переходник USB-TTL в хозяйстве имеется?
     
  15. axet

    axet Нуб

    Переходника нет. Полагаю ,что тестовые скетчи тоже не работают,т.к. на месте координат и времени лишь символы " * " (при запуске test_with_gps_device из TinyGPS-13 светодиод на GPS модуле все еще мигает)
    UPD: Сменил значения в ss.begin и Serial.begin на 9600,в монитор порта пошли координаты
     
    Последнее редактирование: 20 окт 2019
  16. a1000

    a1000 Гуру

    Раз нет переходника, будем создавать программно.
    Залейте этот код
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(3, 4); // RX, TX
    void setup()
    {
      delay(1000); // ждём пока загрузится
      Serial.begin(9600);  //Скорость порта для связи Arduino с компьютером
      Serial.println("Goodnight moon!");
      mySerial.begin(9600);  //Скорость порта для связи Arduino с GPS модулем
    }

    void loop()
    {
      if (mySerial.available())
        Serial.write(mySerial.read());
      if (Serial.available())
        mySerial.write(Serial.read());
    }
    Он просто транслирует в монитор всё что приходит от модуля. Посмотрите, приходит-ли хоть что-то от модуля GPS.
     
  17. axet

    axet Нуб

    И оно действительно транслирует. Работают уже ваш скетч и скетч из примеров библиотеки
     
  18. a1000

    a1000 Гуру

    А попробуйте такой скетч
    Код (C++):
    //#include <LiquidCrystal.h>
    #include <SoftwareSerial.h>
    #include <TinyGPS.h>

    TinyGPS gps;
    SoftwareSerial uart_gps(3, 4); // RX, TX
    //LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD Shield

    // Переменные
    int seconds;
    int timeoffset = 3; // Пользователь должен изменить единицу на соответствующий часовой пояс. В примере используем сдвиг на +1 час.

    // Объявление функций.
    void getgps(TinyGPS &gps);

    // Функция настройки - запускается только при включении
    void setup()
    {
      Serial.begin(9600);     // Запуск последовательного интерфейса для отладки
      uart_gps.begin(9600);     // Запуск приемника UART для GPS
      //lcd.begin(16,2);          // Объявление LCD
      Serial.println("   GPS clock");   // Сообщение приветствия
      delay(1000);              // Ждем одну секунду
      //lcd.clear();              // Очистить LCD
    }

    // Цикл главной программы - запущен всегда
    void loop()
    {
      while(uart_gps.available())
      {
        int c = uart_gps.read();
        if(gps.encode(c))
        {
          getgps(gps);
        }
      }
    }

    /*
    * Данная функция получает данные от GPS модуля
    * и отображает их на LCD
    */

     
    void getgps(TinyGPS &gps)
    {
    int year;
    float latitude, longitude;
    byte month, day, hour, minute, second, hundredths;

      gps.f_get_position(&latitude, &longitude);
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
     
      hour = hour + timeoffset;

      //lcd.clear();//lcd.setCursor(0, 0);
      Serial.print("Time: ");

      if (hour <= 9)
      {
        Serial.print("0"); Serial.print(hour);
      }
      else
      {
        Serial.print(hour);
      }
      Serial.print(":");
      if (minute <=9)
      {
        Serial.print("0"); Serial.print(minute);
      }
      else
      {
        Serial.print(minute);
      }
      Serial.print(":");
      if (second <= 9)
      {
        Serial.print("0"); Serial.println(second, DEC);
      }
      else
      {
        Serial.println(second, DEC);
      }
      //lcd.setCursor(0,1);
      Serial.print("Date: ");
      if (day <= 9)
      {
        Serial.print("0"); Serial.print(day, DEC);
      }
      else
      {
        Serial.print(day, DEC);
      }
      Serial.print("-");
      if (month <= 9)
      {
        Serial.print("0"); Serial.print(month, DEC);
      }
      else
      {
        Serial.print(month, DEC);
      }
      Serial.print("-"); Serial.println(year, DEC);
      delay(100);
      //lcd.clear();
      //lcd.print("Lat: "); lcd.print(latitude, DEC);
      //lcd.setCursor(0,1);
      //lcd.print("Lon: "); lcd.print(longitude, DEC);
      //delay(2000);

    // Debugging purpose only.
    //Serial.print(latitude, DEC); Serial.print(" - "); Serial.println(longitude, DEC);

    }
    Должно в монитор время выводить.
     
  19. axet

    axet Нуб

    Залил-ничего в мониторе порта нет(
     
  20. b707

    b707 Гуру

    по-моему, вы нас дурачите - в этом коде как минимум приветствие
    Serial.println(" GPS clock"); должно выводится ВСЕГДА.
    Не выводится оно не может и с модулем GPS это не связано никак.

    Может у вас схема на скрутках собрана и провода то контачат, то нет?