Страница 1 из 4
Помогите разобратся с кодом пожалуйста.
Добавлено: Сб июн 01, 2024 20:26:59
Vikz
Всем привет. Помогите с кодом пожалуйста. Не могу понять как правильно написать некоторые моменты в коде.
Вот код, который я использую. Я использую плату Arduino Mega.
Код: Выделить всё
String tempstr;
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
if (Serial.available()) { // If anything comes in Serial (USB),
Serial1.write(Serial.read()); // read it and send it out Serial1
}
if (Serial1.available()) { // If anything comes in Serial1 (pins 0 & 1)
Serial.write(Serial1.read()); // read it and send it out Serial (USB)
tempstr=Serial1.readString();
}
}
То что приходит в порт записывается в переменную tempstr. Если данные приходящие в порт меняются то в переменной всё остается как при первой записи. Помогите пожалуйста.
Re: BT_201 Помогите разобратся с модулем пожалуйста.
Добавлено: Вс июн 02, 2024 10:31:27
roman.com
в соседнем форуме BT201 подробно разобрали...
https://radiokot.ru/forum/viewtopic.php?f=62&t=193487
зачем плодить кучу одинаковых тем...
Re: BT_201 Помогите разобратся с модулем пожалуйста.
Добавлено: Вс июн 02, 2024 11:00:08
Vikz
[uquote="roman.com",url="/forum/viewtopic.php?p=4586572#p4586572"]в соседнем форуме BT201 подробно разобрали...
https://radiokot.ru/forum/viewtopic.php?f=62&t=193487
зачем плодить кучу одинаковых тем...[/uquote]
Не увидел ответы на свои вопросы.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Вс июн 02, 2024 23:46:22
Martian
То, что приходит в порт, пишется в аргумент функции, а не в переменную tempstr. Пример есть здесь:
https://www.arduino.cc/reference/en/lan ... available/
https://www.arduino.cc/reference/en/lan ... eadstring/
И да, я из России, если что. А то, может, тебе омерзительно будет пользоваться информацией от российского сообщества, тогда не пользуйся. С переходом по ссылкам тоже проблемы? Тогда и справку не смотри.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Пн июн 03, 2024 01:19:06
Vikz
Код: Выделить всё
if (Serial.available()>0) {
Serial1.write(Serial.read());
}
while (Serial1.available() > 0) { // ПОКА есть что то на вход
strData += (char)Serial1.read(); // забиваем строку принятыми данными
recieved = true; // поднять флаг что получили данные
delay(2); // ЗАДЕРЖКА. Без неё работает некорректно!
}
if (recieved) { // если данные получены
Serial.println(strData); // вывести
// очистить
recieved = false; // опустить флаг
}
Сделал вот так вот. Теперь текст обновляется. В чем может быть хотя бы предположительно причина вывода текста в таком виде?
M1+00000001
M2+00000003
MT+00000082
MK+00000000
MF+R e m a s t e r
Что в порт что на экран пишет с пробелами.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Пн июн 03, 2024 02:55:38
kalobyte
Vikz писал(а):Что в порт что на экран пишет с пробелами.
так а в оригинале как оно есть?
Vikz писал(а): Если данные приходящие в порт меняются то в переменной всё остается как при первой записи. Помогите пожалуйста.
не понял смысла вопроса
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Пн июн 03, 2024 13:56:33
Vikz
[uquote="kalobyte",url="/forum/viewtopic.php?p=4586787#p4586787"]
Vikz писал(а):Что в порт что на экран пишет с пробелами.
так а в оригинале как оно есть?
Как в оригинале? Нууу наверное по правильному должно быть без пробелов а в каком оригинале и где посмотреть? Я только вижу то что выдает в порт и на экран TFT.
И вот интересно что тестирую на компухтере и в порту нет пробелов а на экранчике есть. На стареньком нетбуке всё это тестировал и что в порт пробелы ставит что на экранчик.
Что творится вообще не пойму.
Vikz писал(а): Если данные приходящие в порт меняются то в переменной всё остается как при первой записи. Помогите пожалуйста.
не понял смысла вопроса[/uquote]
Этот вопрос вроде бы решился я чуть выше код прикрепил. А в целом была проблема с тем что меняю командой мелодию на мп3 а в порт приходит то что записалось при первом запуске.
Вылезла еще странная странность.
Код: Выделить всё
if (recieved==true) { // если данные получены
Serial.println(strData); // вывести
recieved = false; // опустить флаг
tft.fillScreen(BLUE);
tft.setCursor(0, 10);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.print(strData);
strData = ""; // очистить
}
Этот кусок по идее единожды опрашивается и то после того как данные с порта записались в переменную. Казалось бы выведем их в порт и на экран но нет. Что туда что туда приходит какой то огрызок от названия. Что опять я не так делаю не пойму.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Вт июн 04, 2024 16:32:23
kalobyte
никто тоже не поймет, потому что никто не знает, что ты там в порт отправляеш и что от туда и как приходит
в ардуине есть буфер на 60 байт вроде
если тебе надо его очистить принудительно, то есть команда flush вроде
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Вт июн 04, 2024 23:53:15
Vikz
[uquote="Vikz",url="/forum/viewtopic.php?p=4586440#p4586440"]Всем привет. Помогите с кодом пожалуйста. Не могу понять как правильно написать некоторые моменты в коде.
Вот код, который я использую. Я использую плату Arduino Mega.
Код: Выделить всё
#define LCD_CS 33 // Chip Select goes to Analog 3
#define LCD_RS 15 // LCD_RS = Register Select or LCD_CD = Command/Data goes to Analog 2
#define LCD_WR 4 // LCD Write goes to Analog 1
#define LCD_RD 2 // LCD Read goes to Analog 0
#define LCD_RESET 32 // Can alternately just connect to Arduino's reset pin
//#include <SPI.h> // f.k. for Arduino-1.5.2
//#include "Adafruit_GFX.h"// Hardware-specific library -----------------------------------------------
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
String strData = "";
boolean recieved;
boolean gate=false;
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
tft.reset(); //hardware reset
uint16_t ID = tft.readID(); //
if (ID == 0xD3D3) ID = 0x9481; // write-only shield
tft.begin(ID);
tft.setRotation(3);
tft.fillScreen(BLUE);
pinMode(22, INPUT);
digitalWrite(22, LOW);
delay(3000); Serial1.println("AT+CM03");
}
void loop() {
if (Serial.available()>0) {
Serial1.write(Serial.read());
}
while (Serial1.available() > 0) { if(gate==false) {delay(100); gate=true;} // ПОКА есть что то на вход
strData += (char)Serial1.read(); // забиваем строку принятыми данными
recieved = true; // поднять флаг что получили данные
delay(2); // ЗАДЕРЖКА. Без неё работает некорректно!
}
if (recieved==true) { // если данные получены
Serial.println(strData); // вывести
tft.fillScreen(BLUE);
tft.setCursor(0, 10);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.print(strData);
strData = ""; // очистить
recieved = false; // опустить флаг
}
if(digitalRead(22)==HIGH) {
delay(200);
Serial1.println("AT+CC");
delay(100);
}
}
То что приходит в порт записывается в переменную tempstr. Если данные приходящие в порт меняются то в переменной всё остается как при первой записи. Помогите пожалуйста.[/uquote]
Добавлено after 30 minutes 18 seconds:
[uquote="kalobyte",url="/forum/viewtopic.php?p=4587405#p4587405"]никто тоже не поймет, потому что никто не знает, что ты там в порт отправляеш и что от туда и как приходит
в ардуине есть буфер на 60 байт вроде
если тебе надо его очистить принудительно, то есть команда flush вроде[/uquote]
Что я отправляю в порт значит рассказываю(я отправил выше код на полную версию тестовую). Так вот в сетапе отправляю команду Serial1.println("AT+CM03"); в мп3 модуль. Команда нужна
что бы модуль перешел из блютуха в режим плеера. Далее плеер (сразу проигрывает мелодию на которой остановился в прошлый раз) шлет всякие нужные штуки типо номер трека количество треков и.т.д ну и название. Далее есть при опросе порта там дилей на 100мс ну ничего лучше я не придумал но после этого трек стал выдавать полностью а не огрызок. Тоже самое я сделал по коду ниже где опрос кнопки и команда Serial1.println("AT+CC"); это на переключение следующего трека. Наверное это супер по идиотски выглядит но хотя бы работает так. Теперь вот вопрос как победить пробелы в названии треков. И главное только имя трека с пробелами остальная инфа без них. Я уж думал что сам проигрыватель как то так шлет но при просмотре сириал порта с компа там нет пробелов. Про буфер тож знаю и походу от этого оч длинные имена не влезают а вместо .mp3 идут кракозябры в конце названия. Ну вот как то так непонятка с пробелами этими.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 00:32:48
Martian
Может, двухбайтная кодировка. Формат данных известен? Если там классическая FAT, то запись коротких и длинных имен различается. Смотрите спецификацию на SD-карты.
И вообще, всё это можно было решить парой экспериментов, да и kalobyte ранее совершенно верно спросил: как в оригинале?
Оригинал смотрится любым HEX-редактором
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 05:53:26
kalobyte
тебе нужно подключить терминал к твоему модулю и руками слать туда команды и считывать ответ и ччтобы твой терминал показывал скрытые не аски символы, которые ты видиш как пробелы
возможно и правда модуль выдает названия треков в утф8 или еще какой херне
это называется отладка
как только ты научишся управлять руками модулем и будеш видеть все символы, что он возвращает и терминал там еще должен тебе показывать точное время с миллисекундами между уходом и приходом ответов, то будеш знать, как правильно работать с модулем и напишеш код рабочий
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 11:30:59
Vikz
[uquote="Martian",url="/forum/viewtopic.php?p=4587549#p4587549"]Может, двухбайтная кодировка. Формат данных известен? Если там классическая FAT, то запись коротких и длинных имен различается. Смотрите спецификацию на SD-карты.
И вообще, всё это можно было решить парой экспериментов, да и kalobyte ранее совершенно верно спросил: как в оригинале?
Оригинал смотрится любым HEX-редактором[/uquote]
Извиняюсь но тут я затрудняюсь ответить. Единственное что я обнаружил это следующее. Я взял какие то мп3 когда то скачаные с короткими названиями. Для теста кинул на флешку и о чудо они выводятся без пробелов. Если же их переименовать то всё опять ломается. Я так понимаю что какие то кодировки еще присутствуют текстовые которые не нравятся модулю что ли. Хз происходит что то мистическое. Под линуксоидами зайти что ли попробовать имена поменять.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 11:46:02
Martian
Причём тут линукс, зачем пробовать... Файловая система флэшки, карты известна и легко смотрится под любой ОС и описана в той или иной степени. Документ выше я прикладывал на FAT. Но с учётом информации, что древние короткие без пробелов, а новые с пробелами - это однозначно кодировка файловой системы, и надо просто удалить лишние пробелы (байты) в принятых данных.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 12:01:25
Vikz
[uquote="Martian",url="/forum/viewtopic.php?p=4587675#p4587675"]Причём тут линукс, зачем пробовать... Файловая система флэшки, карты известна и легко смотрится под любой ОС и описана в той или иной степени. Документ выше я прикладывал на FAT. Но с учётом информации, что древние короткие без пробелов, а новые с пробелами - это однозначно кодировка файловой системы, и надо просто удалить лишние пробелы (байты) в принятых данных.[/uquote]
Я пытался понять что в доке про файловые системы но не вышло понять. Файловая система на флешке fat32.
надо просто удалить лишние пробелы (байты) в принятых данных
Можно этот момент подробнее? Не сталкивался с таким и хз как оно делается.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 12:08:48
Martian
Vikz писал(а):Можно этот момент подробнее? Не сталкивался с таким и хз как оно делается.
Код: Выделить всё
strData += (char)Serial1.read(); // забиваем строку принятыми данными
прежде, чем присваивать данные к strData, проверить, является ли прочитанный символ нужным символом, или не нужным. Проверка делается множеством способом, например:
Это описано в любой книжке, хз как Вы их читали. Это даже уже есть в Вашем коде, хз как Вы его писали.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 12:15:56
Vikz
[uquote="Martian",url="/forum/viewtopic.php?p=4587685#p4587685"]
Vikz писал(а):Можно этот момент подробнее? Не сталкивался с таким и хз как оно делается.
Код: Выделить всё
strData += (char)Serial1.read(); // забиваем строку принятыми данными
прежде, чем присваивать данные к strData, проверить, является ли прочитанный символ нужным символом, или не нужным. Проверка делается множеством способом, например:
Это описано в любой книжке, хз как Вы их читали. Это даже уже есть в Вашем коде, хз как Вы его писали.[/uquote]
Всё просто я не великий кодер и не учился

Мои познания скромные а часть кода просто взята на просторах. Наверное надо было сразу это пояснить что уровень моего программинга где то в начале пути. Ну оттого я и на форуме спрашиваю ведь это логично же

Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 12:46:59
Martian
Неа, не логично. Это долго, и как можете заметить, токсично. И нет ведь гарантии, что мои или чьи-то ответы - верны. Логично всё-таки полноценно пройти обучение, с книжкой, потом с другой книжкой и т.д. Книг, всемирно известных авторов, не так уж много, Керниган, Ритчи, Шилдт, Кнут... здесь в "Сундуке" есть.
Можно не знать FAT (я сам-то лишь недавно разобрался, когда потребовался) и всякое такое, но язык программирования знать обязательно.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 13:17:16
Vikz
[uquote="Martian",url="/forum/viewtopic.php?p=4587698#p4587698"]Неа, не логично. Это долго, и как можете заметить, токсично. И нет ведь гарантии, что мои или чьи-то ответы - верны. Логично всё-таки полноценно пройти обучение, с книжкой, потом с другой книжкой и т.д. Книг, всемирно известных авторов, не так уж много, Керниган, Ритчи, Шилдт, Кнут... здесь в "Сундуке" есть.
Можно не знать FAT (я сам-то лишь недавно разобрался, когда потребовался) и всякое такое, но язык программирования знать обязательно.[/uquote]
Смотрите вот я изучил кучу книг но зачем тогда форумы? Зачем этот форум где люди спрашивают что то? Зачем вообще что то у кого то спрашивать в жизни если пойди и прочти книгу?
Код: Выделить всё
И нет ведь гарантии, что мои или чьи-то ответы - верны.
Я вам верю!
Логично всё-таки полноценно пройти обучение, с книжкой
Не сочтите меня ленивым но вот в чем дело. Я не стремлюсь стать великим программистом. Я даже код своих поделок никому не покажу потому что там нет ничего нового. Я даже уверен что (глядя на мой код) мне скажут мол это не твое займись другим чем нибудь. Многим просто хочется делать поделки и что бы они работали и помогали в жизни. Ну к примеру автоматическое включение света в комнате по событию. По не стандартному событию и такой функционал не заложен в покупных устройствах к примеру(хз включение света потому что чайник нагрелся при этом на улице -20

. Нет если бы у меня была цель устроится на работу и жить только этим я бы конечно посвятил часть жизни этому. В общем не пытаюсь отнять чей то хлеб просто делаю маленькие поделки для себя.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 13:53:27
Martian
Я не собирался стать гонщиком формулы 1, дальнобойщиком и автоконструктором. Но выучил правила дорожного движения и изучил устройство автомобиля. Я не останавливаю других автомобилистов на каждом повороте с вопросом, каким поворотником мигать и как, и не обращаюсь на форум автомобилистов, чтобы узнать, как заправить автомашину.
Аналогия понятна? Ваши вопросы - это не Олимп программирования. Это базовые, необходимые моменты.
И форум - это не вместо книг, а в дополнение им.
Ну, по крайней мере, теперь понятны вопли про мерзкие российские форумы и прекрасные иностранные. У нас кстати, точно такая же мерзкая система обучения в школах была, и прекрасная - в иностранных. В итоге моё поколение знает механику движения небесных тел, хоть это и нафиг не нужно, а иностранцы не знают, как вколотить гвоздь, хоть это и нужно.
Так что, учите английский. На русских форумах Вам будет крипово, кринжово и токсично.
Re: Помогите разобратся с кодом пожалуйста.
Добавлено: Ср июн 05, 2024 17:36:28
Vikz
[uquote="Martian",url="/forum/viewtopic.php?p=4587713#p4587713"]Я не собирался стать гонщиком формулы 1, дальнобойщиком и автоконструктором. Но выучил правила дорожного движения и изучил устройство автомобиля. Я не останавливаю других автомобилистов на каждом повороте с вопросом, каким поворотником мигать и как, и не обращаюсь на форум автомобилистов, чтобы узнать, как заправить автомашину.
Аналогия понятна? Ваши вопросы - это не Олимп программирования. Это базовые, необходимые моменты.
И форум - это не вместо книг, а в дополнение им.
Ну, по крайней мере, теперь понятны вопли про мерзкие российские форумы и прекрасные иностранные. У нас кстати, точно такая же мерзкая система обучения в школах была, и прекрасная - в иностранных. В итоге моё поколение знает механику движения небесных тел, хоть это и нафиг не нужно, а иностранцы не знают, как вколотить гвоздь, хоть это и нужно.
Так что, учите английский. На русских форумах Вам будет крипово, кринжово и токсично.[/uquote]
Странно что вас так зацепило мое высказывание о российском сообществе. Нынешнее поколение знает механику движения небесных тел? Мы ведь живем в настоящем и мое высказывание было про настоящее время. Что там преподают в школах иностранных я не знаю однако пользуемся мы благами этих тупых не знающих про небесные тела и как вколотить гвоздь. Я ведь вам в личку написал ответ с обьяснением. Почему просто не быть людьми и зачем выпячивать свое чсв вот с чем я часто сталкиваюсь. И вы уж извините но сообщество программистов этим очень грешит а жаль. Когда меня просили помочь в той сфере где я больше знаю то мне просто было приятно обьяснить что да как. Понимаете чувство что помог человеку это классно тем более что мне это ничего не стоит

Приветливость и общение вместо "о опять этот отпочковался что ли?". В целом я вас понял но вы меня явно не хотите и не захотите уж так вы устроены. Мы можем и дальше продолжать но зная программистов доказывать им что то бесполезно. Я всё знаю я самый умный и есть только та истина которую я говорю

Сталкивался не раз в живом общении и наслушался

Хотя с вами я бы пообщался но мы тут уже и так не по теме много говорим. Я боюсь модераторы не оценят.