Принять данные по UART2 и отобразить в мониторе UART1
- Войдите на сайт для отправки комментариев
Пт, 21/05/2021 - 18:11
Здравствуйте!
Помогите пожалуйста разобраться, на 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);
}
А что должно происходить? Что куда подключено? Что такое монитор? Зачем вам SoftSerial при таком количестве человеческих USART на меге? Да еще на тех же пинах? Убирайте SS, и будет вам щщастие. Только не забудьте железные USART стартануть как полагается
И еще момент, я бы не стал в лупе делать безусловный println чтобы не зафлудить монитор порта.
при объявлении больше одного экземпляра класса SoftwareSerial прием у них отваливается, хотя передача работает. Так что на Меге можно полноценно юзать 4 сериала плюс один программный сериал.
К порту 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, поэтому не судите строго.
Обе рекомендации сводятся к одному: забудьте о SoftSerial.
А какая альтернатива?
Поясните пожалуйста, что значит «Да еще на тех же пинах» и «Убирайте SS»
Вы пытаетесь организовать SoftwareSerial (SSдля краткости) на тех же пинах, на которых у меги предусмотрен АППАРАТНЫЙ usart сериал порт. Как вы думаете, это хорошая идея? SS - достаточно глючная штука и применяется от безысходности на контроллерах с одним и менее аппаратным USART. У меги ЧЕТЫРЕ аппаратных usart, что вполне достаточно для большинства бытовых задач. SS вам не нужен от слова совсем. И еще, изучите функции класса Serial, там много интересного для себя откроете. Например available(). И изучите внимательно распиновку того контроллера, который собираетесь подвергать пыткам))
А ещё , если создаёшь экземпляр
SoftSerial mySerial1;
То будь добр его инициализировать.
mySerial1.begin(9600);
А какая альтернатива?
Ну вы говорите забыть про SoftSerial, а какую библиотеку порекомендуете для моей задачи?
Для вашей задачи все библиотеки подключены по умолчанию. Если вы используете Mega256, то имеете несколько аппаратных UART.
Спасибо всем за советы, с uart более менее разобрался, но теперь возник новый вопрос с форматированием Serial.print
А если будет :
String("TWA:")+...
Так тоже пробовал, результат тот же..
Так тоже пробовал, результат тот же..
код покажите полностью
#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)); } } }а если сначала собрать строку а потом вывести?
Тоже не получилось
DoDo - код полный бред. Вы приняли из Сериала один единсвенный символ и уже хотите, чтобы библиотека nmea извлекла вам из него аж 4 параметра?
Смешно
вам правильно сказали в #16 - сначала примите и обработайте всю строку, а потом выводите.
Может и бред, но каждый параметр по отдельности выводится на монитор и даже все вместе выводятся, проблемa появляется когда вставляю текст "TWA: "
выложите подключенные файлы
или дайте ссылку, откуда вы их скачали
[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 - у вас как с английским?
Строчку 68 в файле nmea.h читали?
Тоесть нужно проверять если есть дата?
Тоесть нужно проверять если есть дата?
конечно. И появляются данные там далеко не с первым символом.
А пока флаг idataready() не истина - в параметрах либо ничего нет, либо мусор, не имеющий отношения к реальности. либо старые значения от предыдущего чтения Сериал
Спасибо за помощь!
Тоесть нужно проверять если есть дата?
конечно. И появляются данные там далеко не с первым символом.
А пока флаг idataready() не истина - в параметрах либо ничего нет, либо мусор, не имеющий отношения к реальности. либо старые значения от предыдущего чтения Сериал
Написал вот так, но результат тотже..
Попробуйте печатать каждый параметр по отдельности
Сейчас заметил, что если на миг разрывать и снова восстанавливать связь порта Serial1 во время приёма, либо нажимать кнопку ресет на ардуино то иногда появляется правильная строка
Подскажите пожалуйста как обновляется 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();код явно не полный
код явно не полный
Что вы имеете в виду?
скопируйте то, что вы выложили - и попробуйте скомпилировать. Только именно так, как я написал
Да вы правы 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(); } } } }по поводу матриц - уточните - картинка вообще не обновляется или новые данные накладываются на старые?
И второе - попробуйте параллельно с выводом на матрицу печатать данные в Монитор - тогда вы увидите, обновляются ли сами данные на самом деле или они почему-то просто не приходят с GPS
Картинка не обновляется вообще. Попробовал выводить на монитор и действительно не обновляется и там, а вот если закрыть монитор и снова открыть то данные уже правильные на текущий момент
Картинка не обновляется вообще. Попробовал выводить на монитор и действительно не обновляется и там, а вот если закрыть монитор и снова открыть то данные уже правильные на текущий момент
ну вот видите, проблема не в матрице. Вы как-то неверно читаете Сериал1. Вы уверены. что там скорость 4800?
Да проблема была в том что вывод на матрицу либо на сериал были подчинены if ( Serial1.available(), сейчас вынес за скобки и данные стали меняться, но теперь как Вы и говорили накладываются друг на друга
теперь как Вы и говорили накладываются друг на друга
делайте перед каждым новым выводом matrix.clearDisplay() или matrix.clearScreen() (не помню как точно - посмотрите в библиотеке)
Спасибо большое Вы очень помогли! В библиотеке нашёл только fillScreen, он очищает дисплей, но появилось мерцание матрицы и оно как то связано с приёмом данных. Я подключил осциллограф на Serial1 и видно, что пакет принимается одну секунду, потом пауза три секунды и так по кругу, так вот мерцание происходит в три секунды между приёмом пакетов потом на секунду приёма всё нормально итд...
не знаю, какое именно мерцание вы имеете в виду. Вообще в этой библиотеке есть баг, там в некоторых режимах пиксели начинают двоится, автор библиотеки перепутал порядок подачи сигналов Latch и Enable на сдвиговых регистрах. Но проявляется не всегда
выложите полный код, который получился
Оно появляется когда добавляю функцию matrix.fillScreen(0); и почемуто идёт в такт с uart1
#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); }вы зря вынесли вывод на матрицу наружу из блока
так вы очищаете матрицу при каждом проходе через loop() . даже если с GPS нет никаких новых данных.
Перенесите строчки 87-91 на строку 54
Тоже самое, только вернулась и старая проблема (не обновляется disp1)
Мне кажется что проблема fillScreen в том что он стирает все пиксели, а не только те которые не нужны в данный момент
Тоже самое, только вернулась и старая проблема (не обновляется 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; 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; } } } }ну вот, строчку 90-то тоже надо было перенести :) Вставьте ее перед
Вот :) но результат тотже
#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)); } } } }