Зарегистрирован: Вс май 19, 2024 10:05:49 Сообщений: 35 Откуда: Россия Кемерово
Рейтинг сообщения:0
Asmodey, По крайней мере у меня только так получается. Вне цикла с массива информацию не вытянуть. В своё время я долго с этим мучался. По итогу решил отказаться от массива и сделать несколько переменных.
Что ж, тогда увы. Рискну посоветовать выбрать другое хобби (о профессии в данном случае речи и быть не может). Например, только паять-пилить-крутить, а программировать просить программистов.
Зарегистрирован: Вс май 19, 2024 10:05:49 Сообщений: 35 Откуда: Россия Кемерово
Рейтинг сообщения:0
Martian, Так что же всё таки по поводу приёма данных. Вот мне главное с этим разобраться. Потому как это очень нужно. А программировать никто не будет не от кого не дождёшься. Я итак уже два месяца ждал чтоб кто нибудь взялся за написание прошивки к этому модулю, но по итогу пришлось делать всё самому. Да и всё равно программировать по не многу нужно. Потому как в наше время это очень облегчает схемы. А с электроники я всё равно не уйду по крайней мере пока ближайшие несколько лет.
Это хорошо ещё было как то договорился один раз радиоприёмник мне на 8 меге написали. Я только сказал что мне конкретно нужно было и всё, но с этим модулем никто не хочет работать и писать прошивку под него.
Ну, я не могу ответить по приёму данных. Посмотрел лишь частный случай, из последних сообщений. Не вижу всей картины. Ща посмотрю.
Добавлено after 56 minutes 16 seconds: Немного подправил. Код стал в два раза меньше. Вряд ли заработает сразу. Посмотрите. Оптимизируйте как это я сделал, там, где я не сделал. Обратите внимание, что многие места одинаковы, а значит, можно вынести в функцию. Заставьте это снова работать, как было до оптимизации. И обязательно разберитесь с _delay, мне сложно поверить, что они нужны, например, здесь:
Код:
char i = 0; if (rx_buf[i] == 'M') { i++; if (rx_buf[i] == '1') { // M1 Номер текущего файла long dec = CharToInt(rx_buf[3]); _delay_us(1); for (uint8_t x = 4; x < 11; x++) { dec = dec * 16 + CharToInt(rx_buf[x]); _delay_us(1); }
Добавлено after 1 hour 10 minutes 15 seconds:
Код:
char CharToDec(unsigned int s) { unsigned int dec_chl = 0; dek = s % 10; def = s / 10; for (uint8_t i = 0; i < 8; i++) { ind[i] = dek + 48; dek = def % 10; def = def / 10; } return dec_chl; }
Зачем здесь dec_chl? зачем CharToDec() возвращает результат, если ни где потом он не используется, функция вызывается трижды просто CharToDec(dec);? Нужны ли dek и def глобально? Сомневаюсь.
далее:
Код:
// Конвертируем значение уровня звука в ASCII vol = 15; dek = vol % 10; def = vol / 10; ind[0] = dek + 48; dek = def % 10; def = def / 10; ind[1] = dek + 48;
сравните с этим вариантом:
Код:
// Конвертируем значение уровня звука в ASCII vol = 15; ind[0] = 5 + 48; ind[1] = 1 + 48;
Ок, оптимизировали, но смотрим дальше, теперь код такой:
Код:
// Конвертируем значение уровня звука в ASCII vol = 15; ind[0] = 1 + 48; ind[1] = 5 + 48;
// Выводим на дисплей уровень звука lcd_pos(0, 11); lcd_str("VOL"); lcd_pos(0, 14); send_byte(ind[1], 1); lcd_pos(0, 15); send_byte(ind[0], 1);
И снова возникает вопрос: если нигде больше эти значения первых двух элементов массива не используются, то разве не лучше сделать так:
Наверняка можно так (не зная алгоритма, невозможно сказать точно, могут ли быть ещё состояния):
Код:
if (rx_buf[i] == 'M') // QM Режим работы плеера { LED1_R0; LED1_G0; LED1_B0; lcd_pos(0, 13); switch (rx_buf[4]) { case 1 : lcd_str("BLE"); LED1_R1; break; case 2 : lcd_str("USB"); LED1_G1; break; case 3 : lcd_str(" SD"); LED1_B1; break; } _delay_ms(300); }
Видите разницу? Я ухудшил читаемость, расположив несколько операторов на одной строке, но мой вариант всё равно читается значительно лучше!
Так что, приводите код в порядок. Берите книжку по Си, здесь в "Сундуке" их куча, и причёсывайте. С нормальным кодом помочь с алгоритмом желающих будет намного больше, но скорее всего, вопрос сам собой отпадёт: Вы сами увидите, что необходимо сделать.
И изучите структуры. Хранить громкость, режим, имя трека, его длительность и т.д. в них намного удобнее и проще. Такой код:
Код:
if (rx_buf[i] == 'Q') { i++; if (rx_buf[i] == 'M') // QM Режим работы плеера
Рассмотрим реализацию узла управления реле на примере компонентов SUNCO и реле Hongfa. Разберем оптимальные схемы и долговечные полупроводниковые компоненты для их реализации среди широкого ассортимента SUNCO. В номенклатуру компании SUNCO входят диодные мосты, выпрямительные, сигнальные и TVS-диоды, стабилитроны, биполярные, цифровые PNP- и NPN-транзисторы, маломощные тиристоры, симисторы и MOSFET.
Tifaso Я тебе готовый код дал на том форуме,страница 32 И не надо врать-тебе многие помогали,но ты сам начинал-я так не хочу,я так не буду делать,у меня так не работает и т д и т п Выше я тебе написал-убери задержки,тебе пофиг,тогда что толку советовать? Пока идёт задержка 300 мсек все пакеты летят мимо и в итоге у тебя просто будет не успевать обрабатывать
КОМПЭЛ продолжает поддерживать и расширять список складских позиций Hongfa, представленных электромеханическими реле. Продукция компании активно применяется в таких областях, как промышленность, энергетика, бытовые приборы, автомобильная отрасль и специальная техника, требующая высокой надежности и на сегодняшний момент может легко заменить электромеханические реле ушедших из РФ брендов.
Novice user, можно ссылку на тот форум? а то, похоже, здесь просто бессмысленно...
Судя по тому форуму, ТС там около месяца пытался получить что-то с UART и вывести потом на LCD. При помощи целой группы неравнодушных товарищей. Но так и не добился корректного результата. Сомневаюсь что и у вас получится. Как видно - ТС совершенно не изучал программирование, не понимает его, да и не желает изучать. В этом случае от любых объяснений толку не будет никакого. Только разве что если вы Д’Артаньян и полностью весь код сами за ТС напишете.
Тут, наверное, не Керниган с Ритчи нужен, а какой-то вариант Кнута для детей. После прочтения Кернигана и Ритчи у него появится более обширный инструментарий, но он будет им пользоваться всё равно абы как, не видя алгоритмов и картины в целом. Как только это исправится, начнутся возникать вопросы, как написать, и тогда пойдёт уже специфика языка
К слову, почему еще никто не посоветовал топикстартеру конструктор алгоритмов? Ему, и еще тому, который радиву с фонариком, часами и двустрочным дисплеем клепает.
_________________ Астролябия-сама меряет, было бы что мерять!!!
Я пользовался (и сейчас иногда пользуюсь) простенькой и древней прожкой Flowcharts. Но, рекомендовать ее никому не могу, она реально устарела. Сам просто привык к ней. Есть масса других, более современных программ, даже в состав MS Office что-то такое входит.
_________________ Астролябия-сама меряет, было бы что мерять!!!
Зарегистрирован: Вс май 19, 2024 10:05:49 Сообщений: 35 Откуда: Россия Кемерово
Рейтинг сообщения:0
В общем убрал я задержки в приёме данных, но пока это не помогает. Нужно всё таки ещё раз посмотреть и отладить скрипты приёма данных. Похоже ещё и в них проблема. Ну что же а вот и получившийся на данный момент код. Спойлер
//M1 Номер текущего файла long dec = CharToInt(rx_buf[3]); dec = dec*16 + CharToInt(rx_buf[4]); dec = dec*16 + CharToInt(rx_buf[5]); dec = dec*16 + CharToInt(rx_buf[6]); dec = dec*16 + CharToInt(rx_buf[7]); dec = dec*16 + CharToInt(rx_buf[8]); dec = dec*16 + CharToInt(rx_buf[9]); dec = dec*16 + CharToInt(rx_buf[10]);
//M2 Общее колличество звуковых файлов long dec = CharToInt(rx_buf[3]); dec = dec*16 + CharToInt(rx_buf[4]); dec = dec*16 + CharToInt(rx_buf[5]); dec = dec*16 + CharToInt(rx_buf[6]); dec = dec*16 + CharToInt(rx_buf[7]); dec = dec*16 + CharToInt(rx_buf[8]); dec = dec*16 + CharToInt(rx_buf[9]); dec = dec*16 + CharToInt(rx_buf[10]);
long dec = CharToInt(rx_buf[3]); dec = dec*16 + CharToInt(rx_buf[4]); dec = dec*16 + CharToInt(rx_buf[5]); dec = dec*16 + CharToInt(rx_buf[6]); dec = dec*16 + CharToInt(rx_buf[7]); dec = dec*16 + CharToInt(rx_buf[8]); dec = dec*16 + CharToInt(rx_buf[9]); dec = dec*16 + CharToInt(rx_buf[10]);
CharToDec(dec); Time(dec);
lcd_pos(0,7); send_byte(ind1,1); lcd_pos(0,8); send_byte(ind0,1); lcd_pos(0,9); send_byte(':',1); lcd_pos(0,10); send_byte(ind3,1); lcd_pos(0,11); send_byte(ind2,1); } else if (rx_buf[i] == 'F') { //MF Имя текущего файла lcd_pos(0,0); send_byte(rx_buf[4],1); lcd_pos(0,1); send_byte(rx_buf[5],1); lcd_pos(0,2); send_byte(rx_buf[6],1); lcd_pos(0,3); send_byte(rx_buf[7],1); lcd_pos(0,4); send_byte(rx_buf[8],1); lcd_pos(0,5); send_byte(rx_buf[9],1); } /*else if (rx_buf[i] == 'K') { //MK Время воспроизведения текущего файла long dec = CharToInt(rx_buf[3]); dec = dec*16 + CharToInt(rx_buf[4]); dec = dec*16 + CharToInt(rx_buf[5]); dec = dec*16 + CharToInt(rx_buf[6]); dec = dec*16 + CharToInt(rx_buf[7]); dec = dec*16 + CharToInt(rx_buf[8]); dec = dec*16 + CharToInt(rx_buf[9]); dec = dec*16 + CharToInt(rx_buf[10]);
Зарегистрирован: Вс май 19, 2024 10:05:49 Сообщений: 35 Откуда: Россия Кемерово
Рейтинг сообщения:0
Сейчас ещё раз проверил код. Этот код все пришедшие данные обрабатывает при подключении к компу через терминал. И то есть такая особенность. Берёт он в обработку только первые данные которые примет остальное же не обрабатывается. Специально подавал команды на мегу в разных порядках чтобы проверить все скрипты обработки данных и вывод на дисплей. Всё работает, но на дисплей выводит только первые данные. Пробовал запустить в связке с модулем там данные не выводит вообще. В чём тут ещё может быть проблема пока не понятно.
//M1 Номер текущего файла long dec = CharToInt(rx_buf[3]); dec = dec*16 + CharToInt(rx_buf[4]); dec = dec*16 + CharToInt(rx_buf[5]); dec = dec*16 + CharToInt(rx_buf[6]); dec = dec*16 + CharToInt(rx_buf[7]); dec = dec*16 + CharToInt(rx_buf[8]); dec = dec*16 + CharToInt(rx_buf[9]); dec = dec*16 + CharToInt(rx_buf[10]);
//M2 Общее колличество звуковых файлов long dec = CharToInt(rx_buf[3]); dec = dec*16 + CharToInt(rx_buf[4]); dec = dec*16 + CharToInt(rx_buf[5]); dec = dec*16 + CharToInt(rx_buf[6]); dec = dec*16 + CharToInt(rx_buf[7]); dec = dec*16 + CharToInt(rx_buf[8]); dec = dec*16 + CharToInt(rx_buf[9]); dec = dec*16 + CharToInt(rx_buf[10]);
long dec = CharToInt(rx_buf[3]); dec = dec*16 + CharToInt(rx_buf[4]); dec = dec*16 + CharToInt(rx_buf[5]); dec = dec*16 + CharToInt(rx_buf[6]); dec = dec*16 + CharToInt(rx_buf[7]); dec = dec*16 + CharToInt(rx_buf[8]); dec = dec*16 + CharToInt(rx_buf[9]); dec = dec*16 + CharToInt(rx_buf[10]);
CharToDec(dec); Time(dec);
lcd_pos(0,7); send_byte(ind1,1); lcd_pos(0,8); send_byte(ind0,1); lcd_pos(0,9); send_byte(':',1); lcd_pos(0,10); send_byte(ind3,1); lcd_pos(0,11); send_byte(ind2,1); } else if (rx_buf[i] == 'F') { //MF Имя текущего файла lcd_pos(0,0); send_byte(rx_buf[4],1); lcd_pos(0,1); send_byte(rx_buf[5],1); lcd_pos(0,2); send_byte(rx_buf[6],1); lcd_pos(0,3); send_byte(rx_buf[7],1); lcd_pos(0,4); send_byte(rx_buf[8],1); lcd_pos(0,5); send_byte(rx_buf[9],1); } /*else if (rx_buf[i] == 'K') { //MK Время воспроизведения текущего файла long dec = CharToInt(rx_buf[3]); dec = dec*16 + CharToInt(rx_buf[4]); dec = dec*16 + CharToInt(rx_buf[5]); dec = dec*16 + CharToInt(rx_buf[6]); dec = dec*16 + CharToInt(rx_buf[7]); dec = dec*16 + CharToInt(rx_buf[8]); dec = dec*16 + CharToInt(rx_buf[9]); dec = dec*16 + CharToInt(rx_buf[10]);
if (BTN_PREV) { //Команда AT+CD задаём модулю воспроизведение предыдущего трека Send_Command("AT+CD\r\n"); _delay_ms(500); } if (BTN_NEXT) { //Команда AT+CC задаём модулю воспроизведение следующего трека Send_Command("AT+CC\r\n"); _delay_ms(500); } if (BTN_VOL_MIN) { //Команда AT+CF задаём модулю уменьшение громкости Send_Command("AT+CF\r\n"); if (vol>0) { vol--; } _delay_ms(500);
//Конвертируем значение уровня звука в ASCII dek = vol%10; def = vol/10; ind0 = dek+48; dek = def%10; def = def/10; ind1 = dek+48;
//Выводим на дисплей уровень звука lcd_pos(1,11); lcd_str("VOL"); lcd_pos(1,14); send_byte(ind1,1); lcd_pos(1,15); send_byte(ind0,1); } if (BTN_VOL_PLS) { //Команда AT+CE задаём модулю увеличение громкости Send_Command("AT+CE\r\n"); if (vol<30) { vol++; } _delay_ms(500);
//Конвертируем значение уровня звука в ASCII dek = vol%10; def = vol/10; ind0 = dek+48; dek = def%10; def = def/10; ind1 = dek+48;
//Выводим на дисплей уровень звука lcd_pos(1,11); lcd_str("VOL"); lcd_pos(1,14); send_byte(ind1,1); lcd_pos(1,15); send_byte(ind0,1); } if (BTN_MODE) { if (mode == 3) { //Команда AT+CM01 зададаём модулю режим воспроизведения с BLE Send_Command("AT+CM01\r\n"); _delay_ms(500); //Устанавливаем значение 1 в переменной mode mode=1; } else if (mode == 2) { //Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD Send_Command("AT+CM03\r\n"); _delay_ms(500); //Устанавливаем значение 3 в переменной mode mode=3; } else if (mode == 1) { //Команда AT+CM02 зададаём модулю режим воспроизведения с USB Send_Command("AT+CM02\r\n"); _delay_ms(500); //Устанавливаем значение 2 в переменной mode mode=2; } } if (BTN_PLAY_PAUSE) { //Команда AT+CB даём модулю команду PLAY/PAUSE Send_Command("AT+CB\r\n"); _delay_ms(500); } if (BTN_REPEAT) { if (repeat == 2) { repeat=0; //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию Send_Command("AT+AC00\r\n"); _delay_ms(500); LED3_Y0; LED4_B0; } else { repeat=2; //Команда AT+AC02 воспроизведение в цикле Send_Command("AT+AC02\r\n"); _delay_ms(500); LED3_Y1; LED4_B0; } } if (BTN_RAND) { if (repeat == 3) { repeat=0; //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию Send_Command("AT+AC00\r\n"); _delay_ms(500); LED3_Y0; LED4_B0; } else { repeat=3; //Команда AT+AC03 воспроизведение в случайном порядке Send_Command("AT+AC03\r\n"); _delay_ms(500); LED3_Y0; LED4_B1; } } } }
Честно я уже вообще не пойму в чём тут может быть проблема? У меня только напрашивается вывод что всё таки какие то разные скорости используются и потому не успевает обработать данные с модуля. Хотя я там устанавливал скорость на 9600 как и в меге, но на что думать уже не знаю. Либо всё таки этот китайский модуль чем то слегка отличается от других. Ведь мне уже говорили ранее и я сам понял по некоторым признакам что это у меня всего лишь китайская подделка. Однако я недавно заказал ещё два таких модуля с другого магазина. Посмотрю что там придёт. Потому как я уже в сети находил инфу что люди также мучались с неработающими функциями этого модуля и как спецы указывали что скорей всего имеем дело с подделкой. Так что возможно с другим модулем ситуация поменяется.
Нет смысла обсуждать модуль, если как и прежде отсутствует работа с массивом, присутствуют миллион переменных и опять куча задержек, которые максимум должны быть при инициализации дисплея, а больше нигде. Пока программа не будет выглядеть программой, все Ваши сетования на аппаратную часть можно воспринимать как жалобы мартышки на неработающие очки.
Зарегистрирован: Вс май 19, 2024 10:05:49 Сообщений: 35 Откуда: Россия Кемерово
Рейтинг сообщения:0
Martian, от массива одни проблемы там как всегда сыпет кучу ошибок типа не правильно объявил массив или ещё какие то непонятные ошибки. Можешь хоть тогда по человечески написать как объявляются массивы. Вот с этим у меня вечная проблема и потом его нужно объявлять глобально потому как использовать приходится из разных участков программы. По другому то не сделать. Ещё кое что это нужно после передачи данных обнулять массив. То есть очищать чтобы в дальнейшем можно было спокойно работать с ним. Задержки используются только при старте, инициализации и на кнопках больше нигде их нет. В данных местах они обязательны, а больше нигде и не нужно.
while(1) { char i = 0; if (rx_buf[i] == 'M') { i++; if (rx_buf[i] == '1') { ...
чтобы понять, что это безобразие не может работать в принципе. Чего вы ожидали, написав такую галиматью??? Как видно по этому "коду" - вы даже не пытались продумать как в целом должно всё работать. Также как видно опять же по этой галиматье - вы так же совершенно не освоили даже самых основ языка программирования - ни про типы переменных не поняли (и в чём их различие) ни что такое volatile и зачем он нужен, ни про циклы. И т.д. Не говоря уже о том, что совершенно не понимаете - что такое прерывания и основной цикл, как они взаимодействуют.
Вот с этим у меня вечная проблема и потом его нужно объявлять глобально потому как использовать приходится из разных участков программы. По другому то не сделать.
Для начала вам следует взять учебник по программированию и освоить хотя бы самые основы. По другому не сделать. Начинать нужно с самых основ. Разбирая примеры и пытаясь понять - почему сделано так, а не иначе.
Ну или идти в раздел "Предлагаю работу" и искать того, кто напишет вам программу.
Зарегистрирован: Вс май 19, 2024 10:05:49 Сообщений: 35 Откуда: Россия Кемерово
Рейтинг сообщения:0
Да в том то и дело я когда брал этот модуль. Я сразу хотел кого нибудь попросить написать мне прошивку, но подождав какое то время так никто и не отозвался и пришлось писать программу самому, но слишком здесь всё сложно, то в одном месте, то в другом проблемы. Ещё конечно нужно учитывать и то что модули немного разные и под них нужно тоже настраивать прошивку индивидуально. Однако я всё таки думаю так нужно дождаться пока придут ко мне ещё два модуля уже в конце этой недели должны быть в пункте выдачи. Посмотрю уже всё это через терминал чтобы понять что и как и нужно будет обязательно за скринить. После чего готовить так называемое тех задание и точную схему того что я хочу получить на выходе. Дисплей кстати тоже заказал на 2004 потому как уже понял что 1602 достаточно тесный для вывода инфы с данного модуля. Да всё таки наверное попробую составить тех задание и попросить чтоб мне кто нибудь написал прошивку по всем моим запросам, но для начала нужно как следует всё рассмотреть через терминал. Чтобы увидеть какие функции как отрабатывают что выводит модуль когда начинает воспроизводить музыку. Сам я как видно не потяну такую ношу с написанием данной прошивки. Однако я получил не мало опыта в программировании освоил работу с дисплеем и также работу UART. Надеюсь народ согласится написать код для ATMEGA16 для управления модулем.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения