Помогите разобраться с UART DFPlayer Mini 2.0

Тема в разделе "Arduino & Shields", создана пользователем Unruly, 27 ноя 2014.

  1. DIYMan

    DIYMan Guest

    Это что за высер щас был? Я вам ответил ПОЛНОСТЬЮ, если вы неспособны понять ответ - это не мои проблемы.

    Для альтернативно одарённых:

    https://www.arduino.cc/reference/en/language/functions/communication/serial/print/
    https://www.arduino.cc/reference/en/language/functions/communication/serial/write/

    Для умеющих читать код

    Код (C++):

    size_t write(const char *str) {
          if (str == NULL) return 0;
          return write((const uint8_t *)str, strlen(str));
        }
     
    write косвенно зовётся из print, в вашем случае. Обращаем внимание на strlen(str), думаем, какую длину она вернёт для массива char, если где-то по центру там '\0'. Сильно думаем. Потом понимаем, что вместо print надо юзать write, принудительно указывая буфер и его длину. Наслаждаемся просветлением, потом идём на Север, ибо борзый вы, парниша, аж тошнит.
     
    Последнее редактирование модератором: 4 апр 2018
    ARDUIN-щик нравится это.
  2. ARDUIN-щик

    ARDUIN-щик Гик

    А чего добился конкретно ты?
     
  3. variator

    variator Нуб

    Уважаемый DIYMan.
    Я уже писал и повторюсь, что главной мотивацией Вашего нахождения на форуме является принижение других людей с целью ощущения собственного превосходства. Причем выдавать это за служебное рвение выходит у Вас весьма мастерски, так что админы находят Вашу деятельность полезной. К сожалению, подобные случаи имеют место на IT хобби площадках.
    Общение насчет ардуино я начал, увы, именно с Вас. Тогда (на другом сайте) Вы на обычный вопрос отреагировали остротами и отсылкой к мануалу. Поэтому обращаюсь именно к Вам, но подразумеваю и других таких как Вы.
    Никакие навыки и знания, компьютеризируйте Вы хоть десять теплиц, не являются аргументом к тому, чтобы оскорблять кого-либо в явной или завуалированной форме.
    Это разве что по взаимному согласию. Вот к примеру этот чел назвал себя оленем. И дабы не утратить остатка достоинства выдвинул версию о том, что, дескать, стать Гуру можно лишь после того, как осознаешь себя оленем. И далее постепенно (и, вероятнее всего, мучительно сложно) двигаться к Просветлению.
    Каково да? Какой непочатый край работы! Вам незамедлительно следует поинтересоваться у данного индивидуума, а не рановато ли он перестал считать себя оленем? Может быть не все изъяны еще изжиты? Может быть следует даже повторить всеочищающий путь оленизма?
    Гадко это.
    Избавьте же от радости прочитывать сарказм, с которого по-моему Вы ловите ... хорошее настроение.
     
  4. DIYMan

    DIYMan Guest

    Ой, обидел я человека, ой бяда :) Человека, который ДО СИХ ПОР не хочет учиться, а хочет, чтобы ему дали всё готовое. Что, как бы, характеризует. Дополнительно человека характеризует никому не нужные многокилометровые простыни стенаний о том, какой я нехороший, редиска, а он (человек) - обиженный и вообще.

    Я ответ по теме дал? Дал. Что тебе ещё надо, человече? Готовый кусок кода? Да замени ты print свой на write с указанием размера и типа данных, которые хочешь писать - и обижайся дальше, сколько угодно - всё равно тебе это не поможет: ты как был неучем, так и не хочешь ничему учиться. На, обиженка, твой код, поправленный так, чтобы не обращал внимание на 0 в массиве, а отсылал всё, как есть:
    Код (C++):
    char play [3] = {0x00, 0xfe, 0xa2};
    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    Serial.write((const uint8_t*) play, sizeof(play)/sizeof(play[0]));
    delay (1000);
    }
    И обижайся дальше, вместо того, чтобы оторвать ленивую жопу от дивана и выучить самые-самые основы, хотя бы.

    А ещё лучше: вместо обиды убрать кашу из головы и подучить про типы данных. Например, чтобы не было сайд-эффектов с подсчётом длины строки, надо тип данных правильный юзать:

    Код (C++):
    uint8_t play [3] = {0x00, 0xfe, 0xa2};
    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    Serial.write(play, sizeof(play)/sizeof(play[0]));
    delay (1000);
    }
    Найди 10 отличий. Хинт: uint8_t - это byte, беззнаковый тип.

    Можно проще, но не так универсально, как выше, указывать длину данных массива:

    Код (C++):
    uint8_t play [3] = {0x00, 0xfe, 0xa2};
    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    Serial.write(play, 3);
    delay (1000);
    }
    Уже надул щёки, обиженка?
     
    Последнее редактирование модератором: 6 апр 2018
    ARDUIN-щик нравится это.
  5. DIYMan

    DIYMan Guest

    Есть две руки - левая и правая. Если обе растут из плеч, то при ПРАВИЛЬНОМ юзаньи Serial.write надо указывать размер данных и тип данных, и при этом пофиг, сколько там нолей и где они. Пример - я привёл выше, обиженка ты наша.

    И да - эко ты ловко добавил P.S. - незаметно так :)
     
  6. ostrov

    ostrov Гуру

    Я уже писал сегодня, повторюсь. Для готовых решений есть отдельная ветка. Платная. А тут подсказывают и дают советы тем, кто хочет научиться делать сам. Холявщиков тут не очень привечают. Впрочем, нана друг форумах еще жестче.
     
    ARDUIN-щик нравится это.
  7. ostrov

    ostrov Гуру

    Вот так разгораются международные скандалы. ))
     
  8. DIYMan

    DIYMan Guest

    Воинствующие неучи - они такие: вместо того, чтобы понять, что форум - это общение по интересам, и никто тут сопли за рефлексирующими подтирать не будет, следовательно, надо быть готовым учиться - разводят опусы.

    Вот я не поленился, загнал крайний код
    Код (C++):
    uint8_t play [3] = {0x00, 0xfe, 0xa2};
    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    Serial.write(play, 3);
    delay (1000);
    }
    в плату, открыл терминалку - и что я вижу?

    screen.png

    Правильно - вижу, что воинственные обиженные неучи - полные неучи, ДО СИХ ПОР. И корчат из себя обиженное достоинство, прикрываясь псевдоинтеллигентностью. Тьфу.
     
  9. ostrov

    ostrov Гуру

    Разве команда плееру из трех байт?
     
  10. DIYMan

    DIYMan Guest

    Да там не в команде дело, как понимаешь, а в отсутствии понимания основ - чем отличается С++ строка от просто массива байт, и почему затыкается на первом встреченном 0, если юзать print, или если юзать write без приведения типов и указания размерности данных.

    Я ж с его примера взял, как он пытается писать в поток char* с ведущим нулём в массиве и недоумевает "С чего бы это?".
     
  11. ostrov

    ostrov Гуру

    Ну понятно тогда. То есть строкой пытался отправить пакет байтов. Угу.
     
  12. DIYMan

    DIYMan Guest

    @variator - вот хорошая ссылка, звиняй, что на буржуйском, но бананив у нас нема: http://www.cplusplus.com/doc/tutorial/ntcs/

    Там есть наскальные рисунки, как хранится строка в памяти - уж в рисунках разобраться можно, не? Я тебе даже цитату оттуда выкушу, не поленюсь:

    Понимаешь, ЧТО является признаком конца данных в массиве char? Для полного просветления предлагаю тебе выполнить следующий код:

    Код (C++):

    char play [20] = {0};
    void setup() {
    Serial.begin(9600);
    strcpy(play,"Hello");
    Serial.println(play);
    play[2] = 0;
    Serial.println(play);
    play[0] = 0;
    Serial.println(play);
    }

    void loop() {
    }
    И понять, почему строка ВНЕЗАПНО при выводе не выводится вся, и ты видишь во второй строке только "He", а в третьей - ничего не видишь. Хинт: println отличается от print только тем, что после передачи данных посылает в поток два символа "возврат каретки" и "перевод строки", на этом отличия заканчиваются.

    Однако, если данный код заменить на:
    Код (C++):
    char play [20] = {0};
    void setup() {
    Serial.begin(9600);
    strcpy(play,"Hello");
    Serial.println(play);
    play[2] = 0;
    Serial.write((const uint8_t*) play, 20);
    Serial.println();
    play[0] = 0;
    Serial.write((const uint8_t*) play, 20);
    Serial.println();
    }

    void loop() {
    }
    то во второй и третьей строке будет выведен ВЕСЬ массив из 20 символов, что бы там не было записано. И ты увидишь "He\0lo\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" и "\0e\0lo\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" соответственно.

    Андестенд, стеклодув?
     
    Последнее редактирование модератором: 6 апр 2018
  13. Caver

    Caver Нуб

    Подскажите, при переключении треков есть задержка? Я имею в виду если программно не задавать задержку а переключать треки скажем 1>3>1>7 между ними пауза ощутимая есть? При такой схеме если трек 1 играет и приходит команда включить трек 3 - сколько времени железу нужно, чтобы перестать играть первый и запустить третий?
     
  14. ostrov

    ostrov Гуру

    Примерно 100 мс.
     
  15. Caver

    Caver Нуб

    Спасибо за оперативность. А вообще есть информация о высокоскоростных решениях в данной области? Сверхбыстрое переключение треков, в районе 20 мс?
     
  16. ostrov

    ostrov Гуру

    Можно попробовать ускорить, но библиотека для этого не подойдет, она и так кривая. Только вручную. Секвенсор хотите сделать? Не уверен что подойдет.
     
  17. Caver

    Caver Нуб

    Ну не совсем. Хочу с командой записать с живого инструмента отдельные музыкальные отрезки, и реализовать их воспроизведение с помощью некоего девайса, где один человек сможет отыграть всё сразу. И тут два момента возникает - первый - это задержка. Если так глянуть на вскидку - то Зинчук полёт шмеля играет на скорости 20 нот в секунду, это конечно приближённое к максимуму - но вопрос в том, что возможно будет всего две ноты в секунду, но одна от другой они будут расположены на отрезке куда меньшем, нежели 100мс. Второй момент - это возможность параллельного воспроизведения. Должно быть что-то узкоспециализированное, но не могу подобрать запрос.
     
  18. ostrov

    ostrov Гуру

    Два плеера? Три плеера?
     
  19. Caver

    Caver Нуб

    как вариант, но вопрос с задержкой остаётся - я подозреваю, что на запуск трека с момента обнаружения условной нажатой кнопки тоже проходит какое-то время, и ещё подозреваю, что оно будет не сильно меньше, нежели время переключения между треками. Хотя вопрос с параллельным проигрыванием может быть решён подобным способом.
     
  20. Caver

    Caver Нуб

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