BT201 последовательность комманд

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Forsio
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 19, 2024 10:05:49
Откуда: Россия Кемерово
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Forsio »

Asmodey, По крайней мере у меня только так получается. Вне цикла с массива информацию не вытянуть. В своё время я долго с этим мучался. По итогу решил отказаться от массива и сделать несколько переменных.
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Martian »

Что ж, тогда увы. Рискну посоветовать выбрать другое хобби (о профессии в данном случае речи и быть не может). Например, только паять-пилить-крутить, а программировать просить программистов.
Реклама
Аватара пользователя
Forsio
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 19, 2024 10:05:49
Откуда: Россия Кемерово
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Forsio »

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

Это хорошо ещё было как то договорился один раз радиоприёмник мне на 8 меге написали. Я только сказал что мне конкретно нужно было и всё, но с этим модулем никто не хочет работать и писать прошивку под него.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Martian »

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

Добавлено 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);
И снова возникает вопрос: если нигде больше эти значения первых двух элементов массива не используются, то разве не лучше сделать так:

Код: Выделить всё

    vol = 15;
    // Выводим на дисплей уровень звука
    lcd_pos(0, 11);
    lcd_str("VOL");
    lcd_pos(0, 14);
    send_byte(53, 1);// вывод "5"
    lcd_pos(0, 15);
    send_byte(49, 1); // вывод "1"
Можно ли ещё оптимизировать? Конечно!

Код: Выделить всё

    vol = 15;
    // Выводим на дисплей уровень звука
    lcd_pos(0, 11);
    lcd_str("VOL 15");
Ещё:

Код: Выделить всё

if (rx_buf[i] == 'M')
            {
                // QM Режим работы плеера
                if (rx_buf[4] == 1)
                {
                    // Блютус
                    lcd_pos(0, 13);
                    lcd_str("BLE");

                    LED1_R1;
                    LED1_G0;
                    LED1_B0;
                    _delay_ms(300);
                }
                if (rx_buf[4] == 2)
                {
                    // USB Flash
                    lcd_pos(0, 13);
                    lcd_str("USB");

                    LED1_R0;
                    LED1_G1;
                    LED1_B0;
                    _delay_ms(300);
                }
                if (rx_buf[4] == 3)
                {
                    // SD Card
                    lcd_pos(0, 13);
                    lcd_str(" SD");

                    LED1_R0;
                    LED1_G0;
                    LED1_B1;
                    _delay_ms(300);
                }
            }
Наверняка можно так (не зная алгоритма, невозможно сказать точно, могут ли быть ещё состояния):

Код: Выделить всё

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 Режим работы плеера
превратился бы в

Код: Выделить всё

if (Player.Mode == QM)
{ 
Вложения
main.h
(1.53 КБ) 68 скачиваний
main.c
(15.78 КБ) 70 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Re: BT201 последовательность комманд

Сообщение Novice user »

Tifaso Я тебе готовый код дал на том форуме,страница 32
И не надо врать-тебе многие помогали,но ты сам начинал-я так не хочу,я так не буду делать,у меня так не работает и т д и т п
Выше я тебе написал-убери задержки,тебе пофиг,тогда что толку советовать? Пока идёт задержка 300 мсек все пакеты летят мимо и в итоге у тебя просто будет не успевать обрабатывать
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Martian »

Novice user, можно ссылку на тот форум? а то, похоже, здесь просто бессмысленно...
Реклама
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Re: BT201 последовательность комманд

Сообщение Novice user »

jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: BT201 последовательность комманд

Сообщение jcxz »

[uquote="Martian",url="/forum/viewtopic.php?p=4583518#p4583518"]Novice user, можно ссылку на тот форум? а то, похоже, здесь просто бессмысленно...[/uquote]Судя по тому форуму, ТС там около месяца пытался получить что-то с UART и вывести потом на LCD. При помощи целой группы неравнодушных товарищей. Но так и не добился корректного результата. Сомневаюсь что и у вас получится. :dont_know:
Как видно - ТС совершенно не изучал программирование, не понимает его, да и не желает изучать. В этом случае от любых объяснений толку не будет никакого. Только разве что если вы Д’Артаньян и полностью весь код сами за ТС напишете. :dont_know:
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Martian »

Novice user, jcxz, да, ясненько... Тут нужен талантливый педагог, это точно не я.
Аватара пользователя
Asmodey
Друг Кота
Сообщения: 6309
Зарегистрирован: Сб янв 28, 2006 22:47:24

Re: BT201 последовательность комманд

Сообщение Asmodey »

Еxel-моксель... майкрософт! С 8 марта жеж... Почти 3 месяца - четверть года :shock:

За это время какихнить Кернигана с Ритчи можно всех полностью перечитать.
Астролябия-сама меряет, было бы что мерять!!!
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Martian »

Тут, наверное, не Керниган с Ритчи нужен, а какой-то вариант Кнута для детей. После прочтения Кернигана и Ритчи у него появится более обширный инструментарий, но он будет им пользоваться всё равно абы как, не видя алгоритмов и картины в целом. Как только это исправится, начнутся возникать вопросы, как написать, и тогда пойдёт уже специфика языка
Аватара пользователя
Asmodey
Друг Кота
Сообщения: 6309
Зарегистрирован: Сб янв 28, 2006 22:47:24

Re: BT201 последовательность комманд

Сообщение Asmodey »

К слову, почему еще никто не посоветовал топикстартеру конструктор алгоритмов? Ему, и еще тому, который радиву с фонариком, часами и двустрочным дисплеем клепает.
Астролябия-сама меряет, было бы что мерять!!!
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Martian »

Дракона?
Аватара пользователя
Asmodey
Друг Кота
Сообщения: 6309
Зарегистрирован: Сб янв 28, 2006 22:47:24

Re: BT201 последовательность комманд

Сообщение Asmodey »

Я пользовался (и сейчас иногда пользуюсь) простенькой и древней прожкой Flowcharts. Но, рекомендовать ее никому не могу, она реально устарела. Сам просто привык к ней. Есть масса других, более современных программ, даже в состав MS Office что-то такое входит.
Астролябия-сама меряет, было бы что мерять!!!
Аватара пользователя
Forsio
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 19, 2024 10:05:49
Откуда: Россия Кемерово
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Forsio »

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

Код: Выделить всё

#define F_CPU 7372800UL
#define BAUND 9600L
#define UBRRL_value (F_CPU/(BAUND*16))-1

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>

#define MAIN_H_
#define LCD_H_

#define LCD_DDR DDRD
#define LCD_PORT PORTD
#define LCD_PIN PIND

#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA

#define BTN_DDR DDRC
#define BTN_PORT PORTC
#define BTN_PIN PINC

#define DATA 0b11110000
#define RS PD2
#define E PD3

#define E1 LCD_PORT|=(1<<E)
#define E0 LCD_PORT&=~(1<<E)

#define RS1 LCD_PORT|=(1<<RS)
#define RS0 LCD_PORT&=~(1<<RS)

#define LED1_R1 LED_PORT|=(1<<PA0)
#define LED1_R0 LED_PORT&=~(1<<PA0)

#define LED1_G1 LED_PORT|=(1<<PA1)
#define LED1_G0 LED_PORT&=~(1<<PA1)

#define LED1_B1 LED_PORT|=(1<<PA2)
#define LED1_B0 LED_PORT&=~(1<<PA2)

#define LED2_G1 LED_PORT|=(1<<PA3)
#define LED2_G0 LED_PORT&=~(1<<PA3)

#define LED2_R1 LED_PORT|=(1<<PA4)
#define LED2_R0 LED_PORT&=~(1<<PA4)

#define LED3_Y1 LED_PORT|=(1<<PA5)
#define LED3_Y0 LED_PORT&=~(1<<PA5)

#define LED4_B1 LED_PORT|=(1<<PA6)
#define LED4_B0 LED_PORT&=~(1<<PA6)

#define LED5_G1 LED_PORT|=(1<<PA7)
#define LED5_G0 LED_PORT&=~(1<<PA7)

#define BTN_PLAY_PAUSE (~PINC & (1<<PC0))
#define BTN_PREV (~PINC & (1<<PC1))
#define BTN_NEXT (~PINC & (1<<PC2))
#define BTN_VOL_MIN (~PINC & (1<<PC3))
#define BTN_VOL_PLS (~PINC & (1<<PC4))
#define BTN_RAND (~PINC & (1<<PC5))
#define BTN_REPEAT (~PINC & (1<<PC6))
#define BTN_MODE (~PINC & (1<<PC7))

#define FLAG_END_RX (1<<3)
#define FLAG_ERR_RX (1<<4)
#define BUF_SIZE 20

char rx_buf[BUF_SIZE];
char buf_index = 0;
char rxb;

volatile start=1, flags;

uint8_t n=0;

char ind7=0;
char ind6=0;
char ind5=0;
char ind4=0;
char ind3=0;
char ind2=0;
char ind1=0;
char ind0=0;

char chl=0;

char min=0;
char sec=0;

char vol=0;
char mode=0;
char repeat=0;

unsigned int dec=0;
unsigned int def=0;
unsigned int dek=0;
unsigned int dec_chl=0;

void lcd_ini(void);
void lcd_str(char* str);
void lcd_pos(uint8_t line, uint8_t pos);
void lcd_num(uint8_t num, uint8_t line, uint8_t pos);
void bt201_start(void);

void bt201_start (void)
{
	_delay_ms(2000);
	
	//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
	Send_Command("AT+CM02\r\n");
	_delay_ms(100);
	
	//Устанавливаем значение 2 в переменной mode
	mode=2;
	
	//Команда AT+CA15 задаём модулю уровень громкости на 15
	Send_Command("AT+CA15\r\n");
	_delay_ms(100);
	
	//Конвертируем значение уровня звука в ASCII
	vol = 15;
	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);
	
	//Команда AT+AA00 останавливаем воспроизведение
	Send_Command("AT+AA00\r\n");
	_delay_ms(100);
	
	//Команда AT+AA01 задаём модулю команду PLAY
	Send_Command("AT+AA01\r\n");
	_delay_ms(1);
}

void write(uint8_t n)
{
	n<<=4;
	E1;
	LCD_PORT&=~DATA;
	LCD_PORT|=n;
	_delay_us(1);
	E0;
}

void send_byte(uint8_t byte, uint8_t tip)
{
	if (tip) //если тип данные на линии RS 1
	{
		RS1;
	}
	else //иначе тип команда и на линии RS 0
	{
		RS0;
	}
	
	write(byte>>4); //передача старшего полубайта
	_delay_us(250);
	write(byte); //передача младшего полубайта
	_delay_us(250);
}

void lcd_ini(void)
{
	LCD_DDR|=DATA | (1<<RS) | (1<<E);
	_delay_ms(20);
	RS0;
	write(3);
	_delay_ms(5);
	write(3);
	_delay_us(150);
	write(3);
	_delay_us(50);
	write(2);
	_delay_us(50);
	
	send_byte(40,0);
	_delay_us(50);
	
	send_byte(12,0);
	_delay_us(50);
	
	send_byte(1,0);
	_delay_ms(2);
	
	send_byte(6,0);
	_delay_us(50);
}

void lcd_str(char* str)
{
	uint8_t n=0;
	while(str[n])
	{
		send_byte(str[n],1);
		n++;
	}
}

void lcd_pos(uint8_t line, uint8_t pos)
{
	uint8_t adress=(line*0x40+pos)|0x80;
	send_byte(adress,0);
	_delay_us(50);
}

void init_UART()
{
	UBRRL = UBRRL_value;
	UBRRH = UBRRL_value>>8;
	UCSRB|=(1<<TXEN);
	UCSRB|=(1<<RXEN);
	UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1));
	UCSRB|=(1<<RXCIE);
	sei();
	flags = 0;
}

void send_UART(char value)
{
	while(!(UCSRA&(1<<UDRE)));
	UDR=value;
}

void Send_Command(char *str)
{
	for(uint8_t i = 0; i < strlen(str); i++)
	{
		while(!(UCSRA&(1<<UDRE)));
		UDR=str[i];
	}
}

char CharToInt(char c)
{
	char chl=0;
	if ('0' <= c && c <= '9')
	{
		chl=c-48;
	}
	else if ('A' <= c && c <= 'F')
	{
		chl=c-55;
	}
	return chl;
}

char CharToDec(unsigned int s)
{
	unsigned int dec_chl=0;
	dek = s%10;
	def = s/10;
	ind0 = dek+48;
	dek = def%10;
	def = def/10;
	ind1 = dek+48;
	dek = def%10;
	def = def/10;
	ind2 = dek+48;
	dek = def%10;
	def = def/10;
	ind3 = dek+48;
	dek = def%10;
	def = def/10;
	ind4 = dek+48;
	dek = def%10;
	def = def/10;
	ind5 = dek+48;
	dek = def%10;
	def = def/10;
	ind6 = dek+48;
	dek = def%10;
	def = def/10;
	ind7 = dek+48;
	return dec_chl;
}

char Time(unsigned int s)
{
	char min = s/60;
	char sec = s%60;
	
	dek = min%10;
	def = min/10;
	ind0 = dek+48;
	dek = def%10;
	def = def/10;
	ind1 = dek+48;
	
	dek = sec%10;
	def = sec/10;
	ind2 = dek+48;
	dek = def%10;
	def = def/10;
	ind3 = dek+48;
	
	return min;
}

ISR(USART_RXC_vect)
{
	char rxb = UDR;
	if(!(flags & FLAG_END_RX))
	{
		rx_buf[buf_index]=rxb;
		if(rx_buf[buf_index] == 0x0D)
		{
			flags |= FLAG_END_RX;
			return;
		}
		buf_index++;
		if(buf_index >= BUF_SIZE)
		{
			buf_index = 0;
			flags |= FLAG_ERR_RX;
		}
	}
}

int main(void)
{
	BTN_PORT = 0b11111111;
	init_UART();
	lcd_ini();
	flags = 0;
	
	_delay_ms(5000);
	
	bt201_start();
	
	while(1)
    {
		char i = 0;
		if (rx_buf[i] == 'M')
		{
			i++;
			if (rx_buf[i] == '1')
			{
				dec=0;
				def=0;
				dek=0;
				
				ind7=0;
				ind6=0;
				ind5=0;
				ind4=0;
				ind3=0;
				ind2=0;
				ind1=0;
				ind0=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]);
				
				CharToDec(dec);
				
				lcd_pos(1,0);
				send_byte(ind3,1);
				lcd_pos(1,1);
				send_byte(ind2,1);
				lcd_pos(1,2);
				send_byte(ind1,1);
				lcd_pos(1,3);
				send_byte(ind0,1);
				lcd_pos(1,4);
				send_byte('/',1);
			}
		    else if (rx_buf[i] == '2')
			{
				dec=0;
				def=0;
				dek=0;
				
				ind7=0;
				ind6=0;
				ind5=0;
				ind4=0;
				ind3=0;
				ind2=0;
				ind1=0;
				ind0=0;
				
				//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]);
				
				CharToDec(dec);
				
				lcd_pos(1,5);
				send_byte(ind3,1);
				lcd_pos(1,6);
				send_byte(ind2,1);
				lcd_pos(1,7);
				send_byte(ind1,1);
				lcd_pos(1,8);
				send_byte(ind0,1);
			}
		    else if (rx_buf[i] == 'T')
			{
				dec=0;
				def=0;
				dek=0;
				
				ind7=0;
				ind6=0;
				ind5=0;
				ind4=0;
				ind3=0;
				ind2=0;
				ind1=0;
				ind0=0;
				
				min=0;
				sec=0;
				
				//MT Общее время воспроизведения
				
				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]);
				
				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] == 'P')
			{
				//MP Текущее состояние плеера
				if (rx_buf[4] == 0)
				{
					//Стоп
					LED2_R1;
					LED2_G0;
					_delay_us(250);
				}
				if (rx_buf[4] == 1)
				{
					//Воспроизведение
					LED2_G1;
					LED2_R0;
					_delay_us(250);
				}
				if (rx_buf[4] == 2)
				{
					//Пауза
					LED2_R1;
					LED2_G0;
					_delay_us(250);
					LED2_G1;
					LED2_R0;
					_delay_us(250);
				}
			}
			*/
		}
		
		/*
		//i = 0;
		if (rx_buf[i] == 'Q')
		{
			//i++;
			if (rx_buf[i] == 'M')
			{
				//QM Режим работы плеера
				if (rx_buf[4] == 1)
				{
					//Блютус
					lcd_pos(0,13);
					lcd_str("BLE");
					
					LED1_R1;
					LED1_G0;
					LED1_B0;
					_delay_us(250);
				}
				if (rx_buf[4] == 2)
				{
					//USB Flash
					lcd_pos(0,13);
					lcd_str("USB");
					
					LED1_R0;
					LED1_G1;
					LED1_B0;
					_delay_us(250);
				}
				if (rx_buf[4] == 3)
				{
					//SD Card
					lcd_pos(0,13);
					lcd_str(" SD");
					
					LED1_R0;
					LED1_G0;
					LED1_B1;
					_delay_us(250);
				}
			}
		}
		*/
		
		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");
			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");
			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;
			}
		}
    }
}
Аватара пользователя
Forsio
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 19, 2024 10:05:49
Откуда: Россия Кемерово
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Forsio »

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

Код: Выделить всё

#define F_CPU 7372800UL
#define BAUND 9600L
#define UBRRL_value (F_CPU/(BAUND*16))-1

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>

#define MAIN_H_
#define LCD_H_

#define LCD_DDR DDRD
#define LCD_PORT PORTD
#define LCD_PIN PIND

#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA

#define BTN_DDR DDRC
#define BTN_PORT PORTC
#define BTN_PIN PINC

#define DATA 0b11110000
#define RS PD2
#define E PD3

#define E1 LCD_PORT|=(1<<E)
#define E0 LCD_PORT&=~(1<<E)

#define RS1 LCD_PORT|=(1<<RS)
#define RS0 LCD_PORT&=~(1<<RS)

#define LED1_R1 LED_PORT|=(1<<PA0)
#define LED1_R0 LED_PORT&=~(1<<PA0)

#define LED1_G1 LED_PORT|=(1<<PA1)
#define LED1_G0 LED_PORT&=~(1<<PA1)

#define LED1_B1 LED_PORT|=(1<<PA2)
#define LED1_B0 LED_PORT&=~(1<<PA2)

#define LED2_G1 LED_PORT|=(1<<PA3)
#define LED2_G0 LED_PORT&=~(1<<PA3)

#define LED2_R1 LED_PORT|=(1<<PA4)
#define LED2_R0 LED_PORT&=~(1<<PA4)

#define LED3_Y1 LED_PORT|=(1<<PA5)
#define LED3_Y0 LED_PORT&=~(1<<PA5)

#define LED4_B1 LED_PORT|=(1<<PA6)
#define LED4_B0 LED_PORT&=~(1<<PA6)

#define LED5_G1 LED_PORT|=(1<<PA7)
#define LED5_G0 LED_PORT&=~(1<<PA7)

#define BTN_PLAY_PAUSE (~PINC & (1<<PC0))
#define BTN_PREV (~PINC & (1<<PC1))
#define BTN_NEXT (~PINC & (1<<PC2))
#define BTN_VOL_MIN (~PINC & (1<<PC3))
#define BTN_VOL_PLS (~PINC & (1<<PC4))
#define BTN_RAND (~PINC & (1<<PC5))
#define BTN_REPEAT (~PINC & (1<<PC6))
#define BTN_MODE (~PINC & (1<<PC7))

#define FLAG_END_RX (1<<3)
#define FLAG_ERR_RX (1<<4)
#define BUF_SIZE 20

char rx_buf[BUF_SIZE];
char buf_index = 0;
char rxb;

volatile start=1, flags;

uint8_t n=0;

char ind7=0;
char ind6=0;
char ind5=0;
char ind4=0;
char ind3=0;
char ind2=0;
char ind1=0;
char ind0=0;

char chl=0;

char min=0;
char sec=0;

char vol=0;
char mode=0;
char repeat=0;

unsigned int dec=0;
unsigned int def=0;
unsigned int dek=0;

void lcd_ini(void);
void lcd_str(char* str);
void lcd_pos(uint8_t line, uint8_t pos);
void lcd_num(uint8_t num, uint8_t line, uint8_t pos);
void bt201_start(void);

void bt201_start (void)
{
	_delay_ms(2000);
	
	//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
	Send_Command("AT+CM02\r\n");
	_delay_ms(100);
	
	//Устанавливаем значение 2 в переменной mode
	mode=2;
	
	//Команда AT+CA15 задаём модулю уровень громкости на 15
	Send_Command("AT+CA15\r\n");
	_delay_ms(100);
	
	//Конвертируем значение уровня звука в ASCII
	vol = 15;
	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);
	
	//Команда AT+AA00 останавливаем воспроизведение
	Send_Command("AT+AA00\r\n");
	_delay_ms(100);
	
	//Команда AT+AA01 задаём модулю команду PLAY
	Send_Command("AT+AA01\r\n");
	_delay_ms(1);
}

void write(uint8_t n)
{
	n<<=4;
	E1;
	LCD_PORT&=~DATA;
	LCD_PORT|=n;
	_delay_us(1);
	E0;
}

void send_byte(uint8_t byte, uint8_t tip)
{
	if (tip) //если тип данные на линии RS 1
	{
		RS1;
	}
	else //иначе тип команда и на линии RS 0
	{
		RS0;
	}
	
	write(byte>>4); //передача старшего полубайта
	_delay_us(250);
	write(byte); //передача младшего полубайта
	_delay_us(250);
}

void lcd_ini(void)
{
	LCD_DDR|=DATA | (1<<RS) | (1<<E);
	_delay_ms(20);
	RS0;
	write(3);
	_delay_ms(5);
	write(3);
	_delay_us(150);
	write(3);
	_delay_us(50);
	write(2);
	_delay_us(50);
	
	send_byte(40,0);
	_delay_us(50);
	
	send_byte(12,0);
	_delay_us(50);
	
	send_byte(1,0);
	_delay_ms(2);
	
	send_byte(6,0);
	_delay_us(50);
}

void lcd_str(char* str)
{
	uint8_t n=0;
	while(str[n])
	{
		send_byte(str[n],1);
		n++;
	}
}

void lcd_pos(uint8_t line, uint8_t pos)
{
	uint8_t adress=(line*0x40+pos)|0x80;
	send_byte(adress,0);
	_delay_us(50);
}

void init_UART()
{
	UBRRL = UBRRL_value;
	UBRRH = UBRRL_value>>8;
	UCSRB|=(1<<TXEN);
	UCSRB|=(1<<RXEN);
	UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1));
	UCSRB|=(1<<RXCIE);
	sei();
	flags = 0;
}

void send_UART(char value)
{
	while(!(UCSRA&(1<<UDRE)));
	UDR=value;
}

void Send_Command(char *str)
{
	for(uint8_t i = 0; i < strlen(str); i++)
	{
		while(!(UCSRA&(1<<UDRE)));
		UDR=str[i];
	}
}

char CharToInt(char c)
{
	char chl=0;
	if ('0' <= c && c <= '9')
	{
		chl=c-48;
	}
	else if ('A' <= c && c <= 'F')
	{
		chl=c-55;
	}
	return chl;
}

char CharToDec(unsigned int s)
{
	dek = s%10;
	def = s/10;
	ind0 = dek+48;
	dek = def%10;
	def = def/10;
	ind1 = dek+48;
	dek = def%10;
	def = def/10;
	ind2 = dek+48;
	dek = def%10;
	def = def/10;
	ind3 = dek+48;
	dek = def%10;
	def = def/10;
	ind4 = dek+48;
	dek = def%10;
	def = def/10;
	ind5 = dek+48;
	dek = def%10;
	def = def/10;
	ind6 = dek+48;
	dek = def%10;
	def = def/10;
	ind7 = dek+48;
}

char Time(unsigned int s)
{
	char min = s/60;
	char sec = s%60;
	
	dek = min%10;
	def = min/10;
	ind0 = dek+48;
	dek = def%10;
	def = def/10;
	ind1 = dek+48;
	
	dek = sec%10;
	def = sec/10;
	ind2 = dek+48;
	dek = def%10;
	def = def/10;
	ind3 = dek+48;
}

ISR(USART_RXC_vect)
{
	char rxb = UDR;
	if(!(flags & FLAG_END_RX))
	{
		rx_buf[buf_index]=rxb;
		if(rx_buf[buf_index] == 0x0D)
		{
			flags |= FLAG_END_RX;
			return;
		}
		buf_index++;
		if(buf_index >= BUF_SIZE)
		{
			buf_index = 0;
			flags |= FLAG_ERR_RX;
		}
	}
}

int main(void)
{
	BTN_PORT = 0b11111111;
	init_UART();
	lcd_ini();
	flags = 0;
	
	_delay_ms(5000);
	
	bt201_start();
	
	while(1)
    {
		char i = 0;
		if (rx_buf[i] == 'M')
		{
			i++;
			if (rx_buf[i] == '1')
			{
				dec=0;
				def=0;
				dek=0;
				
				ind7=0;
				ind6=0;
				ind5=0;
				ind4=0;
				ind3=0;
				ind2=0;
				ind1=0;
				ind0=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]);
				
				CharToDec(dec);
				
				lcd_pos(1,0);
				send_byte(ind3,1);
				lcd_pos(1,1);
				send_byte(ind2,1);
				lcd_pos(1,2);
				send_byte(ind1,1);
				lcd_pos(1,3);
				send_byte(ind0,1);
				lcd_pos(1,4);
				send_byte('/',1);
			}
		    else if (rx_buf[i] == '2')
			{
				dec=0;
				def=0;
				dek=0;
				
				ind7=0;
				ind6=0;
				ind5=0;
				ind4=0;
				ind3=0;
				ind2=0;
				ind1=0;
				ind0=0;
				
				//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]);
				
				CharToDec(dec);
				
				lcd_pos(1,5);
				send_byte(ind3,1);
				lcd_pos(1,6);
				send_byte(ind2,1);
				lcd_pos(1,7);
				send_byte(ind1,1);
				lcd_pos(1,8);
				send_byte(ind0,1);
			}
		    else if (rx_buf[i] == 'T')
			{
				dec=0;
				def=0;
				dek=0;
				
				ind7=0;
				ind6=0;
				ind5=0;
				ind4=0;
				ind3=0;
				ind2=0;
				ind1=0;
				ind0=0;
				
				min=0;
				sec=0;
				
				//MT Общее время воспроизведения
				
				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]);
				
				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] == 'P')
			{
				//MP Текущее состояние плеера
				if (rx_buf[4] == 0)
				{
					//Стоп
					LED2_R1;
					LED2_G0;
					_delay_us(250);
				}
				if (rx_buf[4] == 1)
				{
					//Воспроизведение
					LED2_G1;
					LED2_R0;
					_delay_us(250);
				}
				if (rx_buf[4] == 2)
				{
					//Пауза
					LED2_R1;
					LED2_G0;
					_delay_us(250);
					LED2_G1;
					LED2_R0;
					_delay_us(250);
				}
			}
			*/
		}
		
		/*
		//i = 0;
		if (rx_buf[i] == 'Q')
		{
			//i++;
			if (rx_buf[i] == 'M')
			{
				//QM Режим работы плеера
				if (rx_buf[4] == 1)
				{
					//Блютус
					lcd_pos(0,13);
					lcd_str("BLE");
					
					LED1_R1;
					LED1_G0;
					LED1_B0;
					_delay_us(250);
				}
				if (rx_buf[4] == 2)
				{
					//USB Flash
					lcd_pos(0,13);
					lcd_str("USB");
					
					LED1_R0;
					LED1_G1;
					LED1_B0;
					_delay_us(250);
				}
				if (rx_buf[4] == 3)
				{
					//SD Card
					lcd_pos(0,13);
					lcd_str(" SD");
					
					LED1_R0;
					LED1_G0;
					LED1_B1;
					_delay_us(250);
				}
			}
		}
		*/
		
		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 как и в меге, но на что думать уже не знаю.
Либо всё таки этот китайский модуль чем то слегка отличается от других. Ведь мне уже говорили ранее и я сам понял по некоторым признакам что это у меня всего лишь китайская подделка. Однако я недавно заказал ещё два таких модуля с другого магазина. Посмотрю что там придёт. Потому как я уже в сети находил инфу что люди также мучались с неработающими функциями этого модуля и как спецы указывали что скорей всего имеем дело с подделкой.
Так что возможно с другим модулем ситуация поменяется.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Martian »

Нет смысла обсуждать модуль, если как и прежде отсутствует работа с массивом, присутствуют миллион переменных и опять куча задержек, которые максимум должны быть при инициализации дисплея, а больше нигде. Пока программа не будет выглядеть программой, все Ваши сетования на аппаратную часть можно воспринимать как жалобы мартышки на неработающие очки.
Аватара пользователя
Forsio
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 19, 2024 10:05:49
Откуда: Россия Кемерово
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Forsio »

Martian, от массива одни проблемы там как всегда сыпет кучу ошибок типа не правильно объявил массив или ещё какие то непонятные ошибки. Можешь хоть тогда по человечески написать как объявляются массивы. Вот с этим у меня вечная проблема и потом его нужно объявлять глобально потому как использовать приходится из разных участков программы. По другому то не сделать.
Ещё кое что это нужно после передачи данных обнулять массив. То есть очищать чтобы в дальнейшем можно было спокойно работать с ним.
Задержки используются только при старте, инициализации и на кнопках больше нигде их нет. В данных местах они обязательны, а больше нигде и не нужно.
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: BT201 последовательность комманд

Сообщение jcxz »

[uquote="Forsio",url="/forum/viewtopic.php?p=4585128#p4585128"]В чём тут ещё может быть проблема пока не понятно.[/uquote]Что там непонятного? Достаточно взглянуть хотя бы на это:
[uquote="Forsio",url="/forum/viewtopic.php?p=4585128#p4585128"]

Код: Выделить всё

ISR(USART_RXC_vect)
{
	char rxb = UDR;
	if(!(flags & FLAG_END_RX))
	{
		rx_buf[buf_index]=rxb;
		if(rx_buf[buf_index] == 0x0D)
		{
			flags |= FLAG_END_RX;
			return;
		}
		buf_index++;
		if(buf_index >= BUF_SIZE)
		{
			buf_index = 0;
			flags |= FLAG_ERR_RX;
		}
	}
}

int main(void)
{
	BTN_PORT = 0b11111111;
	init_UART();
	lcd_ini();
	flags = 0;
	
	_delay_ms(5000);
	
	bt201_start();
	
	while(1)
    {
		char i = 0;
		if (rx_buf[i] == 'M')
		{
			i++;
			if (rx_buf[i] == '1')
			{
...
[/uquote]
чтобы понять, что это безобразие не может работать в принципе.
Чего вы ожидали, написав такую галиматью???
Как видно по этому "коду" - вы даже не пытались продумать как в целом должно всё работать. Также как видно опять же по этой галиматье - вы так же совершенно не освоили даже самых основ языка программирования - ни про типы переменных не поняли (и в чём их различие) ни что такое volatile и зачем он нужен, ни про циклы. И т.д. Не говоря уже о том, что совершенно не понимаете - что такое прерывания и основной цикл, как они взаимодействуют.

Добавлено after 2 minutes 22 seconds:
[uquote="Forsio",url="/forum/viewtopic.php?p=4585140#p4585140"]Вот с этим у меня вечная проблема и потом его нужно объявлять глобально потому как использовать приходится из разных участков программы. По другому то не сделать.[/uquote]Для начала вам следует взять учебник по программированию и освоить хотя бы самые основы. По другому не сделать. :dont_know:
Начинать нужно с самых основ. Разбирая примеры и пытаясь понять - почему сделано так, а не иначе.

Ну или идти в раздел "Предлагаю работу" и искать того, кто напишет вам программу.
Аватара пользователя
Forsio
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 19, 2024 10:05:49
Откуда: Россия Кемерово
Контактная информация:

Re: BT201 последовательность комманд

Сообщение Forsio »

Да в том то и дело я когда брал этот модуль. Я сразу хотел кого нибудь попросить написать мне прошивку, но подождав какое то время так никто и не отозвался и пришлось писать программу самому, но слишком здесь всё сложно, то в одном месте, то в другом проблемы.
Ещё конечно нужно учитывать и то что модули немного разные и под них нужно тоже настраивать прошивку индивидуально. Однако я всё таки думаю так нужно дождаться пока придут ко мне ещё два модуля уже в конце этой недели должны быть в пункте выдачи. Посмотрю уже всё это через терминал чтобы понять что и как и нужно будет обязательно за скринить. После чего готовить так называемое тех задание и точную схему того что я хочу получить на выходе. Дисплей кстати тоже заказал на 2004 потому как уже понял что 1602 достаточно тесный для вывода инфы с данного модуля. Да всё таки наверное попробую составить тех задание и попросить чтоб мне кто нибудь написал прошивку по всем моим запросам, но для начала нужно как следует всё рассмотреть через терминал. Чтобы увидеть какие функции как отрабатывают что выводит модуль когда начинает воспроизводить музыку.
Сам я как видно не потяну такую ношу с написанием данной прошивки. Однако я получил не мало опыта в программировании освоил работу с дисплеем и также работу UART. Надеюсь народ согласится написать код для ATMEGA16 для управления модулем.
Ответить

Вернуться в «Разные вопросы по МК»