Принять данные по UART2 и отобразить в мониторе UART1

DoDo
Offline
Зарегистрирован: 21.05.2021

Здравствуйте!

Помогите пожалуйста разобраться, на Arduino mega на порт2 (пин 18 и 19) идёт поток данных которые я хочу вывести на монитор с помощью порт1  (пин 0 и 1), но ничего не происходит...

 


#include <SoftwareSerial.h>

SoftwareSerial mySerial1(0, 1);   // RX,TX
SoftwareSerial mySerial2(19, 18); // RX,TX



void setup()
{
  Serial.begin(4800);
}



void loop()
{

  char data = mySerial2.read();

  mySerial1.println(data);

}

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

А что должно происходить? Что куда подключено? Что такое монитор? Зачем вам SoftSerial при таком количестве человеческих USART на меге? Да еще на тех же пинах? Убирайте SS, и будет вам щщастие. Только не забудьте железные USART стартануть как полагается

И еще момент, я бы не стал в лупе делать безусловный println чтобы не зафлудить монитор порта. 

5N62V
Offline
Зарегистрирован: 25.02.2016

при объявлении больше одного экземпляра класса SoftwareSerial прием у них отваливается, хотя передача работает. Так что на Меге можно полноценно юзать 4 сериала плюс один программный сериал.

DoDo
Offline
Зарегистрирован: 21.05.2021

К порту 19, 18 (mySerial2) через конвертер RS485 to TTL подключен навигационный прибор, который с периодичностью примерно в одну секунду передаёт данные по протоколу NMEA. Это примерно вот такие строки ($IIMWD,,T,153,M,000.0,N,000.0,M*73). А порт 0, 1 (mySerial1) на сколько я понял привязан к USB Arduino mega и соответственно происходить должно то, что данные которые поступают на порт mySerial2 должны передаться на порт mySerial1, а далее через USB на компьютер к которому соединена Arduino и отображаться на такой программе как на пример Port Monitor. В будущем эти данные будут обрабатываться, переформатироваться и отображаться на дисплее, но в данный момент нет дисплея и хотелось бы как-то убедится, что доходит до контролера и в каком виде.

Поясните пожалуйста, что значит «Да еще на тех же пинах» и «Убирайте SS»

Я буквально несколько дней как занялся программированием  Arduino, поэтому не судите строго.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Обе рекомендации сводятся к одному: забудьте о SoftSerial.

DoDo
Offline
Зарегистрирован: 21.05.2021

А какая альтернатива?

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

DoDo пишет:

Поясните пожалуйста, что значит «Да еще на тех же пинах» и «Убирайте SS»

Вы пытаетесь организовать SoftwareSerial (SSдля краткости) на тех же пинах, на которых у меги предусмотрен АППАРАТНЫЙ usart сериал порт. Как вы думаете, это хорошая идея? SS - достаточно глючная штука и применяется от безысходности на контроллерах с одним и менее аппаратным USART.  У меги ЧЕТЫРЕ аппаратных usart, что вполне достаточно для большинства бытовых задач. SS вам не нужен от слова совсем. И еще, изучите функции класса Serial, там много интересного для себя откроете. Например available(). И изучите внимательно распиновку того контроллера, который собираетесь подвергать пыткам))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А ещё , если создаёшь экземпляр
SoftSerial mySerial1;
То будь добр его инициализировать.
mySerial1.begin(9600);

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DoDo пишет:

А какая альтернатива?

Альтернатива чему?

DoDo
Offline
Зарегистрирован: 21.05.2021

Ну вы говорите забыть про SoftSerial, а какую библиотеку порекомендуете для моей задачи? 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Для вашей задачи все библиотеки подключены по умолчанию. Если вы используете Mega256, то имеете несколько аппаратных UART.

 

DoDo
Offline
Зарегистрирован: 21.05.2021

Спасибо всем за советы, с uart более менее  разобрался, но теперь возник новый вопрос с форматированием Serial.print

      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      char g4 = (nmea.get4());
      //Serial.println(g4);
      Serial.println(String(g1) + String(g2) + String(g3) + String(g4));
Учитывая что например nmea.get1 = 1, nmea.get2 = 5, nmea.get3 = 9, nmea.get4 = R  вывести должно 159R, что так и происходит. Но почему когда код Serial.println("TWA: " + String(g1) + String(g2) + String(g3) + String(g4)); вместο TWA: 159R  выводит  только TWA: ?
Kakmyc
Offline
Зарегистрирован: 15.01.2018

А если будет :
String("TWA:")+...

DoDo
Offline
Зарегистрирован: 21.05.2021

Kakmyc пишет:
А если будет : String("TWA:")+...

Так тоже пробовал, результат тот же..

b707
Offline
Зарегистрирован: 26.05.2017

DoDo пишет:

Kakmyc пишет:
А если будет : String("TWA:")+...

Так тоже пробовал, результат тот же..

код покажите полностью

DoDo
Offline
Зарегистрирован: 21.05.2021

#include "main.h"
#include "nmea.h"
NMEA nmea;
int inByte = 0;
char buffer;

void setup() {
  Serial.begin(9600);
  Serial1.begin(4800);
}

void loop(void) {

  if ( Serial1.available() ) {
    delay(10);
    while ( Serial1.available() ) {
      buffer = Serial1.read();
      volatile char c = buffer;
      nmea.fusedata(c);
      //Serial.print(buffer);

  
      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      char g4 = (nmea.get4());
      //Serial.println(g4);
      Serial.println(String(g1) + String(g2) + String(g3) + String(g4));
    
      
  
    

    }
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а если сначала собрать строку а потом вывести?

DoDo
Offline
Зарегистрирован: 21.05.2021

Тоже не получилось 

      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      char g4 = (nmea.get4());
      String resg = (String("TWA: ") + String(g1) + String(g2) + String(g3) + String(g4));
 
      Serial.println(resg);
b707
Offline
Зарегистрирован: 26.05.2017

DoDo - код полный бред. Вы приняли из Сериала один единсвенный символ и уже хотите, чтобы библиотека nmea извлекла вам из него аж 4 параметра?

Смешно

вам правильно сказали в #16 - сначала примите и обработайте всю строку, а потом выводите.

DoDo
Offline
Зарегистрирован: 21.05.2021

Может и бред, но каждый параметр по отдельности выводится на монитор и даже все вместе выводятся, проблемa появляется  когда вставляю текст "TWA: "

b707
Offline
Зарегистрирован: 26.05.2017

выложите подключенные файлы

#include "main.h"
#include "nmea.h"

или дайте ссылку, откуда вы их скачали

DoDo
Offline
Зарегистрирован: 21.05.2021
[code]

#ifndef NMEA_H
#define NMEA_H
#include "main.h"

class NMEA {

  public:
    bool			m_bFlagRead,					// flag used by the parser, when a valid sentence has begun
              m_bFlagDataReady;				// valid GPS fix and data available, user can call reader functions
    char			tmp_words[20][15],				//	hold parsed words for one given NMEA sentence
              tmp_szChecksum[15];				//	hold the received checksum for one given NMEA sentence
    char*           str1;
    char*           str2;
    // will be set to true for characters between $ and * only
    bool			m_bFlagComputedCks ;			// used to compute checksum and indicate valid checksum interval (between $ and * in a given sentence)
    int				m_nChecksum ;					// numeric checksum, computed for a given sentence
    bool			m_bFlagReceivedCks ;			// after getting  * we start cuttings the received checksum
    int				index_received_checksum ;		// used to parse received checksum

    // word cutting variables
    int				m_nWordIdx ,					// the current word in a sentence
              m_nPrevIdx,						// last character index where we did a cut
              m_nNowIdx ;						// current character index

    // globals to store parser results
    float			res_fLongitude;					// GPRMC and GPGGA
    float			res_fLatitude;					// GPRMC and GPGGA
    char	        res_1, res_2, res_3,		    // GPRMC and GPGGA
                  res_4, res_5, res_6,
                  res_7, res_8, res_9,
                  res_10, res_11, res_12,
                  res_13, res_14, res_15,
                  res_16, res_17,	res_18,
                  res_19,	 res_20;		// GPGGA
    float			res_fSpeed;						// GPRMC
    float			res_fBearing;					// GPRMC
    int             res_21;


    // the parser, currently handling GPRMC and GPGGA, but easy to add any new sentences
    void			parsedata();
    // aux functions
    int				digit2dec(char hexdigit);
    float			string2float(char* s);
    int				mstrcmp(const char *s1, const char *s2);

  public:
    // constructor, initing a few variables
    NMEA() {
      m_bFlagRead = false; //are we in a sentence?
      m_bFlagDataReady = false; //is data available?
    }

    /*
       The serial data is assembled on the fly, without using any redundant buffers.
       When a sentence is complete (one that starts with $, ending in EOL), all processing is done on
       this temporary buffer that we've built: checksum computation, extracting sentence "words" (the CSV values),
       and so on.
       When a new sentence is fully assembled using the fusedata function, the code calls parsedata.
       This function in turn, splits the sentences and interprets the data. Here is part of the parser function,
       handling both the $GPRMC NMEA sentence:
    */
    int				fusedata(char c);


    // READER functions: retrieving results, call isdataready() first
    bool			isdataready();
    int				get1();
    int				get2();
    int				get3();
    int				get4();
    int				get5();
    int				get6();
    int			  get7();
    int			  get8();
    int			  get9();
    int			  get10();
    int		    get11();
    int		    get12();
    int       get13();
    int       get14();
    int       get15();
    int       get16();
    int       get17();
    int       get18();
    int       get19();
    int       get20();
    int       getLR();
};


#endif
[/code]

 

DoDo
Offline
Зарегистрирован: 21.05.2021
#ifndef MAIN_H_
#define MAIN_H_

#endif /* MAIN_H_ */

 

b707
Offline
Зарегистрирован: 26.05.2017

DoDo - у вас как с английским?

Строчку 68 в файле nmea.h читали?

DoDo
Offline
Зарегистрирован: 21.05.2021

Тоесть нужно проверять если есть дата? 

b707
Offline
Зарегистрирован: 26.05.2017

DoDo пишет:

Тоесть нужно проверять если есть дата? 

конечно. И появляются данные там далеко не с первым символом.

А пока флаг idataready() не истина - в параметрах либо ничего нет, либо мусор, не имеющий отношения к реальности. либо старые значения от предыдущего чтения Сериал

DoDo
Offline
Зарегистрирован: 21.05.2021

Спасибо за помощь!

DoDo
Offline
Зарегистрирован: 21.05.2021

b707 пишет:

DoDo пишет:

Тоесть нужно проверять если есть дата? 

конечно. И появляются данные там далеко не с первым символом.

А пока флаг idataready() не истина - в параметрах либо ничего нет, либо мусор, не имеющий отношения к реальности. либо старые значения от предыдущего чтения Сериал

Написал вот так, но результат тотже.. 

      if (nmea.isdataready() == 0)
      {
      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      char g4 = (nmea.get4());
      String resg = (String("TWA: ") + String(g1) + String(g2) + String(g3) + String(g4));
      Serial.println(resg);
b707
Offline
Зарегистрирован: 26.05.2017

Попробуйте печатать каждый параметр по отдельности

DoDo
Offline
Зарегистрирован: 21.05.2021

Сейчас заметил, что если на миг разрывать и снова восстанавливать связь порта Serial1 во время приёма, либо нажимать кнопку ресет на ардуино то иногда появляется правильная строка 

DoDo
Offline
Зарегистрирован: 21.05.2021

Подскажите пожалуйста как обновляется led matrix display, при включении выводит переменную disp1 на дисплей, но когда содержимое disp1 меняется на дисплее остаются старые данные...  

 
#include "main.h"
#include "nmea.h"
#include <RGBmatrixPanel.h>
#define PIN_PHOTO_SENSOR A3
#define PIN_POS_SELECT A4

#define CLK 11 
#define OE  9
#define LAT 10
#define A   A0
#define B   A1
#define C   A2

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

NMEA nmea;
int inByte = 0;
char buffer;
String disp1;


void setup() {
  Serial.begin(9600);
  Serial1.begin(4800);
  matrix.begin();
}

void loop(void) {

  if ( Serial1.available() ) {
    delay(10);
   while ( Serial1.available() ) {
     buffer = Serial1.read();
    volatile char c = buffer;
     nmea.fusedata(c);
      //Serial.print(buffer);
      
      /*TWA (True Wind Angle, 0 to 180 degrees (L or R))*/
    if (nmea.isdataready() == 0)
     {
      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      String twa = (String(g1) + String(g2) + String(g3));
   

  disp1 = twa;
 
  matrix.setCursor(1, 0);
  matrix.setTextSize(1);   
  matrix.setTextColor(matrix.Color333(1,1,1));
  matrix.print(disp1);
  matrix.updateDisplay();

 

b707
Offline
Зарегистрирован: 26.05.2017

код явно не полный

DoDo
Offline
Зарегистрирован: 21.05.2021

b707 пишет:

код явно не полный

Что вы имеете в виду?

b707
Offline
Зарегистрирован: 26.05.2017

DoDo пишет:

Что вы имеете в виду?

скопируйте то, что вы выложили - и попробуйте скомпилировать. Только именно так, как я написал

DoDo
Offline
Зарегистрирован: 21.05.2021

Да вы правы 4 скобки не скопировались


#include "main.h"
#include "nmea.h"
#include <RGBmatrixPanel.h>
#define PIN_PHOTO_SENSOR A3
#define PIN_POS_SELECT A4

#define CLK 11 
#define OE  9
#define LAT 10
#define A   A0
#define B   A1
#define C   A2

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

NMEA nmea;
int inByte = 0;
char buffer;
String disp1;


void setup() {
  Serial.begin(9600);
  Serial1.begin(4800);
  matrix.begin();
}

void loop(void) {

  if ( Serial1.available() ) {
    delay(10);
   while ( Serial1.available() ) {
     buffer = Serial1.read();
    volatile char c = buffer;
     nmea.fusedata(c);
      //Serial.print(buffer);
      
      /*TWA (True Wind Angle, 0 to 180 degrees (L or R))*/
    if (nmea.isdataready() == 0)
     {
      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      String twa = (String(g1) + String(g2) + String(g3));
   

  disp1 = twa;
 
  matrix.setCursor(1, 0);
  matrix.setTextSize(1);   
  matrix.setTextColor(matrix.Color333(1,1,1));
  matrix.print(disp1);
  matrix.updateDisplay();

   
  }
  }
  } 
  }
     

 

b707
Offline
Зарегистрирован: 26.05.2017

по поводу матриц - уточните - картинка вообще не обновляется или новые данные накладываются на старые?

И второе - попробуйте параллельно с выводом на матрицу печатать данные в Монитор - тогда вы увидите, обновляются ли сами данные на самом деле или они почему-то просто не приходят с GPS

DoDo
Offline
Зарегистрирован: 21.05.2021

Картинка не обновляется вообще. Попробовал выводить на монитор и действительно не обновляется и там, а вот если закрыть монитор и снова открыть то данные уже правильные на текущий момент 

b707
Offline
Зарегистрирован: 26.05.2017

DoDo пишет:

Картинка не обновляется вообще. Попробовал выводить на монитор и действительно не обновляется и там, а вот если закрыть монитор и снова открыть то данные уже правильные на текущий момент 

ну вот видите, проблема не в матрице. Вы как-то неверно читаете Сериал1. Вы уверены. что там скорость 4800?

DoDo
Offline
Зарегистрирован: 21.05.2021

Да проблема была в том что вывод на матрицу либо на сериал были подчинены if ( Serial1.available(), сейчас вынес за скобки и данные стали меняться, но теперь как Вы и говорили накладываются друг на друга

b707
Offline
Зарегистрирован: 26.05.2017

DoDo пишет:

теперь как Вы и говорили накладываются друг на друга

делайте перед каждым новым выводом matrix.clearDisplay() или matrix.clearScreen() (не помню как точно - посмотрите в библиотеке)

DoDo
Offline
Зарегистрирован: 21.05.2021

Спасибо большое Вы очень помогли! В библиотеке нашёл только fillScreen, он очищает дисплей, но появилось мерцание матрицы и оно как то связано с приёмом данных. Я подключил осциллограф на Serial1 и видно, что пакет принимается одну секунду, потом пауза три секунды и так по кругу, так вот мерцание происходит в три секунды между приёмом пакетов потом на секунду приёма всё нормально итд... 

  matrix.fillScreen(0);
  matrix.setCursor(1, 0);
  matrix.setTextSize(1);   
  matrix.setTextColor(matrix.Color333(1,1,1));
  matrix.print(disp1);

 

b707
Offline
Зарегистрирован: 26.05.2017

не знаю, какое именно мерцание вы имеете в виду. Вообще в  этой библиотеке есть баг, там в некоторых режимах пиксели начинают двоится, автор библиотеки перепутал порядок подачи сигналов Latch и Enable на сдвиговых регистрах. Но проявляется не всегда

b707
Offline
Зарегистрирован: 26.05.2017

выложите полный код, который получился

DoDo
Offline
Зарегистрирован: 21.05.2021

Оно появляется когда добавляю функцию matrix.fillScreen(0); и почемуто идёт в такт с uart1

DoDo
Offline
Зарегистрирован: 21.05.2021

#include "main.h"
#include "nmea.h"
#include <RGBmatrixPanel.h>
#define PIN_PHOTO_SENSOR A3
#define PIN_POS_SELECT A4

#define CLK 11 
#define OE  9
#define LAT 10
#define A   A0
#define B   A1
#define C   A2

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

NMEA nmea;
int inByte = 0;
char buffer;

int photo = 0;
int pos = 0;
int r;
int g;
int b;
String disp1;


void setup() {
  Serial.begin(9600);
  Serial1.begin(4800);
  matrix.begin();
   
}

void loop(void) {

  if ( Serial1.available() ) {
    delay(10);
   while ( Serial1.available() ) {
     buffer = Serial1.read();
    volatile char c = buffer;
     nmea.fusedata(c);
      //Serial.print(buffer);
      
      /*TWA (True Wind Angle, 0 to 180 degrees (L or R))*/
    if (nmea.isdataready() == 0)
     {
      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      char g4 = (nmea.get4());
     //String twa = (String(nmea.str1) + String(g1) + String(g2) + String(g3) + String(nmea.str2) + String(g4));
     String twa = (String(g1) + String(g2) + String(g3));
   

      /*TWD (True Wind Direction)*/
      char g5 = (nmea.get5());
      char g6 = (nmea.get6());
      char g7 = (nmea.get7());
      String twd = (String(nmea.str3) + String(g5) + String(g6) + String(g7));

      /*TWS (True Wind Speed)*/
      char g8 = (nmea.get8());
      char g9 = (nmea.get9());
      char g10 = (nmea.get10());
      char g11 = (nmea.get11());
      char g12 = (nmea.get12());
      String tws = (String(nmea.str4) + String(g8) + String(g9) + String(g10) + String(g11) + String(g12));

       /*VPW (Velocity Parallel Wind)*/
      char g13 = (nmea.get13());
      char g14 = (nmea.get14());
      char g15 = (nmea.get15());
      char g16 = (nmea.get16());
      char g17 = (nmea.get17());
      String vpw = (String(nmea.str5) + String(g13) + String(g14) + String(g15) + String(g16) + String(g17));



 

  disp1 = twa;

     }
     }
     }
  matrix.fillScreen(0);
  matrix.setCursor(1, 0);
  matrix.setTextSize(1);   
  matrix.setTextColor(matrix.Color333(1,1,1));
  matrix.print(disp1);


  }

 

b707
Offline
Зарегистрирован: 26.05.2017

вы зря вынесли вывод на матрицу наружу из блока

if (nmea.isdataready() == 0)

так вы очищаете матрицу при каждом проходе через loop() . даже если с GPS нет никаких новых данных.

Перенесите строчки 87-91 на строку 54

DoDo
Offline
Зарегистрирован: 21.05.2021

Тоже самое, только вернулась и старая проблема (не обновляется disp1) 

Мне кажется что проблема fillScreen в том что он стирает все пиксели, а не только те которые не нужны в данный момент

b707
Offline
Зарегистрирован: 26.05.2017

DoDo пишет:

Тоже самое, только вернулась и старая проблема (не обновляется disp1)

судя по всему, вы что-то не то сделали. Покажите код после изменений

DoDo
Offline
Зарегистрирован: 21.05.2021

#include "main.h"
#include "nmea.h"
#include <RGBmatrixPanel.h>
#define PIN_PHOTO_SENSOR A3
#define PIN_POS_SELECT A4

#define CLK 11 
#define OE  9
#define LAT 10
#define A   A0
#define B   A1
#define C   A2

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

NMEA nmea;
int inByte = 0;
char buffer;

int photo = 0;
int pos = 0;
int r;
int g;
int b;
String disp1;
String disp2;


void setup() {
  Serial.begin(9600);
  Serial1.begin(4800);
  matrix.begin();
   
}

void loop(void) {

  if ( Serial1.available() ) {
  
    delay(10);
   while ( Serial1.available() ) {
     buffer = Serial1.read();
    volatile char c = buffer;
    
     nmea.fusedata(c);
      //Serial.print(buffer);
      
      /*TWA (True Wind Angle, 0 to 180 degrees (L or R))*/
    if (nmea.isdataready() == 0)
     {
      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      char g4 = (nmea.get4());
     //String twa = (String(nmea.str1) + String(g1) + String(g2) + String(g3) + String(nmea.str2) + String(g4));
     String twa = (String(g1) + String(g2) + String(g3));
      matrix.fillScreen(0);
      matrix.setCursor(1, 0);
      matrix.setTextSize(1);   
      matrix.setTextColor(matrix.Color333(1,1,1));
      matrix.print(disp1);
   

      /*TWD (True Wind Direction)*/
      char g5 = (nmea.get5());
      char g6 = (nmea.get6());
      char g7 = (nmea.get7());
      String twd = (String(nmea.str3) + String(g5) + String(g6) + String(g7));

      /*TWS (True Wind Speed)*/
      char g8 = (nmea.get8());
      char g9 = (nmea.get9());
      char g10 = (nmea.get10());
      char g11 = (nmea.get11());
      char g12 = (nmea.get12());
      String tws = (String(nmea.str4) + String(g8) + String(g9) + String(g10) + String(g11) + String(g12));

       /*VPW (Velocity Parallel Wind)*/
      char g13 = (nmea.get13());
      char g14 = (nmea.get14());
      char g15 = (nmea.get15());
      char g16 = (nmea.get16());
      char g17 = (nmea.get17());
      String vpw = (String(nmea.str5) + String(g13) + String(g14) + String(g15) + String(g16) + String(g17));



 

  disp1 = twa;
  
  
  


     }
     }
     }
 




  }
     

 

b707
Offline
Зарегистрирован: 26.05.2017

ну вот,  строчку 90-то тоже надо было перенести :) Вставьте ее перед

matrix.print(disp1);

 

DoDo
Offline
Зарегистрирован: 21.05.2021

Вот :) но результат тотже 


#include "main.h"
#include "nmea.h"
#include <RGBmatrixPanel.h>
#define PIN_PHOTO_SENSOR A3
#define PIN_POS_SELECT A4

#define CLK 11 
#define OE  9
#define LAT 10
#define A   A0
#define B   A1
#define C   A2

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

NMEA nmea;
int inByte = 0;
char buffer;

int photo = 0;
int pos = 0;
int r;
int g;
int b;
String disp1;
String disp2;


void setup() {
  Serial.begin(9600);
  Serial1.begin(4800);
  matrix.begin();
   
}

void loop(void) {

  if ( Serial1.available() ) {
  
    delay(10);
   while ( Serial1.available() ) {
     buffer = Serial1.read();
    volatile char c = buffer;
    
     nmea.fusedata(c);
      //Serial.print(buffer);
      
      /*TWA (True Wind Angle, 0 to 180 degrees (L or R))*/
    if (nmea.isdataready() == 0)
     {
      char g1 = (nmea.get1());
      char g2 = (nmea.get2());
      char g3 = (nmea.get3());
      char g4 = (nmea.get4());
     //String twa = (String(nmea.str1) + String(g1) + String(g2) + String(g3) + String(nmea.str2) + String(g4));
     String twa = (String(g1) + String(g2) + String(g3));
      matrix.fillScreen(0);
      matrix.setCursor(1, 0);
      matrix.setTextSize(1);   
      matrix.setTextColor(matrix.Color333(1,1,1));
      disp1 = twa;
      matrix.print(disp1);
   

      /*TWD (True Wind Direction)*/
      char g5 = (nmea.get5());
      char g6 = (nmea.get6());
      char g7 = (nmea.get7());
      String twd = (String(nmea.str3) + String(g5) + String(g6) + String(g7));

      /*TWS (True Wind Speed)*/
      char g8 = (nmea.get8());
      char g9 = (nmea.get9());
      char g10 = (nmea.get10());
      char g11 = (nmea.get11());
      char g12 = (nmea.get12());
      String tws = (String(nmea.str4) + String(g8) + String(g9) + String(g10) + String(g11) + String(g12));

       /*VPW (Velocity Parallel Wind)*/
      char g13 = (nmea.get13());
      char g14 = (nmea.get14());
      char g15 = (nmea.get15());
      char g16 = (nmea.get16());
      char g17 = (nmea.get17());
      String vpw = (String(nmea.str5) + String(g13) + String(g14) + String(g15) + String(g16) + String(g17));

     }
     }
     }

     }