Страница 1 из 5
BT201 последовательность комманд
Добавлено: Вс май 19, 2024 11:29:29
Forsio
Сразу извиняюсь если не туда написал. Долго думал и искал подходящий раздел под мою тему.
Купил я себе модуль BT201. И сейчас стоит задача написать прошивку в ATMEGA16 пишу на си. С этим я надеюсь что управлюсь сам. Ну если что спрошу здесь. Пока нужно прояснить последовательность команд модуля BT201. Во первых что нужно делать при запуске модуля?
Так я уже смотрел и ознакомился с многими командами и документацией к модулю.
Была уже написана и основа под ATMEGA16 то есть вывод информации на дисплей, передача и приём UART. В общем всё что нужно для написания прошивки управления из меги. Также уже готова и запаяна плата.
Вот схема.

Сейчас для начала нужно понять последовательность команд модуля.
Re: BT201 последовательность комманд
Добавлено: Пн май 20, 2024 08:39:55
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)
{
//Команда AT+CT01 задаём модулю скорость 9600
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('T');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(2000);
//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(20);
//Устанавливаем значение 2 в переменной mode
mode=2;
//Команда AT+CA15 задаём модулю уровень громкости на 15
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('A');
send_UART('1');
send_UART('5');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Конвертируем значение уровня звука в ASCII
vol = 15;
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,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;
}
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)
{
init_UART();
lcd_ini();
void bt201_start();
_delay_ms(500);
send_UART('O');
send_UART('K');
send_UART('!');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
flags = 0;
while(1)
{
char i = 0;
if (rx_buf[i] == 'M')
{
i++;
if (rx_buf[i] == '1')
{
//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')
{
//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')
{
//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] == '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] == '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] == 'P')
{
//MP Текущее состояние плеера
if (rx_buf[4] == 0)
{
//Стоп
LED2_R1;
LED2_G0;
}
if (rx_buf[4] == 1)
{
//Воспроизведение
LED2_G1;
LED2_R0;
}
if (rx_buf[4] == 2)
{
//Пауза
LED2_R1;
LED2_G0;
_delay_ms(10);
LED2_G1;
LED2_R0;
_delay_ms(10);
}
}
}
else 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;
}
if (rx_buf[4] == 2)
{
//USB Flash
lcd_pos(0,13);
lcd_str("USB");
LED1_R0;
LED1_G1;
LED1_B0;
}
if (rx_buf[4] == 3)
{
//SD Card
lcd_pos(0,13);
lcd_str(" SD");
LED1_R0;
LED1_G0;
LED1_B1;
}
}
}
/*
//Команда AT+M1 запрос номера текущего файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Команда AT+M2 запрос общего колличества файлов
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Команда AT+MT запрос общего времени воспроизводимого файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('T');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Команда AT+MK запрос текущего времени воспроизводимого файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('K');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
*/
if (BTN_PREV)
{
//Команда AT+CD задаём модулю воспроизведение предыдущего трека
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('D');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
}
if (BTN_NEXT)
{
//Команда AT+CC задаём модулю воспроизведение следующего трека
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('C');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
}
if (BTN_VOL_MIN)
{
//Команда AT+CF задаём модулю уменьшение громкости
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('F');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
vol--;
//Конвертируем значение уровня звука в ASCII
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,1);
}
if (BTN_VOL_PLS)
{
//Команда AT+CE задаём модулю увеличение громкости
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('E');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
vol++;
//Конвертируем значение уровня звука в ASCII
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,1);
}
if (BTN_MODE)
{
if (mode == 3)
{
//Команда AT+CM01 зададаём модулю режим воспроизведения с BLE
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Устанавливаем значение 1 в переменной mode
mode=1;
}
if (mode == 2)
{
//Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('3');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Устанавливаем значение 3 в переменной mode
mode=3;
}
if (mode == 1)
{
//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Устанавливаем значение 2 в переменной mode
mode=2;
}
}
if (BTN_PLAY_PAUSE)
{
//Команда AT+CB даём модулю команду PLAY/PAUSE
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('B');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
}
if (BTN_REPEAT)
{
if (repeat == 2)
{
repeat=0;
//Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B0;
}
else
{
repeat=2;
//Команда AT+AC02 воспроизведение в цикле
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y1;
LED4_B0;
}
}
if (BTN_RAND)
{
if (repeat == 3)
{
repeat=0;
//Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B0;
}
else
{
repeat=3;
//Команда AT+AC03 воспроизведение в случайном порядке
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('3');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B1;
}
}
}
}
Так вот что данный код проверялся сами функции все рабочие, но проблема тут как раз таки в том что здесь нужно разобраться с правильной последовательностью команд самого модуля BT201 и возможно здесь нужны будут какие ни будь задержки чтобы успевала обработаться информация. Вот с этим нужно разобраться. Потому как этот код проверялся в железе уже вместе с самим модулем, но в модуле происходит постоянный цикличный перезапуск и он так и не может нормально стартовать. Хотя от компа через терминал модуль успешно работает.
Re: BT201 последовательность комманд
Добавлено: Пн май 20, 2024 08:53:30
Novice user
На схем.нет вам все тщательно разжевали и положили в рот,осталось только проглотить
Re: BT201 последовательность комманд
Добавлено: Пн май 20, 2024 09:03:15
Forsio
Ничего подобного там то что подсказали с написанием кода я уже и сделал, но сейчас вопрос стоит именно с самим модулем BT201. Нужно разбираться именно с последовательностью команд и задержками между этими командами в самом модуле BT201.
Re: BT201 последовательность комманд
Добавлено: Пн май 20, 2024 09:57:21
Novice user
Как не сказали?Я лично несколько раз вам писал-ЧИТАЙ ДАТАШИТ!!!
Например-нахрена каждый раз при включении переключать скорость на 9600,и то не правильно? В той вашей теме в самом первом сообщении есть ссылка,которую ВЫ ИЗУЧИЛИ (ваши слова),там русским языком написано как переключить скорость
Re: BT201 последовательность комманд
Добавлено: Пн май 20, 2024 10:24:24
Forsio
Novice user, ну со скоростью понятно значит не нужно её каждый раз дергать раз уже установлена на 9600, то так и должно быть тем более что я её уже через терминал давно переключил в самом модуле. Но дальше то абсолютно непонятно какие команды засылать модулю, что опрашивать и главное с какими задержками. Я так примерно что по логике написал, но насколько оно верно непонятно.
Там то что я смотрел несколько статей всегда попадается подключение с ардуиной что ни разу здесь не подходит. Пытался в тех скриптах отследить хотя бы команды и задержки всю эту последовательность, но там мало что находишь. Нету у меня чёткого представления в какой последовательности должны выполнятся команды и с какими паузами (задержками) потому как у меня ещё есть подозрение что без задержек оно не успевает обрабатываться на какой либо стороне.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 07:06:55
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)
{
/*
//Команда AT+CT01 задаём модулю скорость 9600
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('T');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(2000);
*/
//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Устанавливаем значение 2 в переменной mode
mode=2;
//Команда AT+CA15 задаём модулю уровень громкости на 15
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('A');
send_UART('1');
send_UART('5');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(2000);
//Конвертируем значение уровня звука в ASCII
vol = 15;
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,1);
//Команда AT+AA00 останавливаем воспроизведение
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('A');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(100);
//Команда AT+AA01 задаём модулю команду PLAY
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('A');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
}
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;
}
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)
{
init_UART();
lcd_ini();
void bt201_start();
_delay_ms(500);
send_UART('O');
send_UART('K');
send_UART('!');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
flags = 0;
while(1)
{
char i = 0;
if (rx_buf[i] == 'M')
{
i++;
if (rx_buf[i] == '1')
{
//M1 Номер текущего файла
long dec = CharToInt(rx_buf[3]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[4]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[5]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[6]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[7]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[8]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[9]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[10]);
_delay_us(1);
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);
_delay_ms(300);
}
else if (rx_buf[i] == '2')
{
//M2 Общее колличество звуковых файлов
long dec = CharToInt(rx_buf[3]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[4]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[5]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[6]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[7]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[8]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[9]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[10]);
_delay_us(1);
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);
_delay_ms(300);
}
else if (rx_buf[i] == 'T')
{
//MT Общее время воспроизведения
long dec = CharToInt(rx_buf[3]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[4]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[5]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[6]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[7]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[8]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[9]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[10]);
_delay_us(1);
CharToDec(dec);
_delay_us(1);
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);
_delay_ms(300);
}
/*else if (rx_buf[i] == 'K')
{
//MK Время воспроизведения текущего файла
long dec = CharToInt(rx_buf[3]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[4]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[5]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[6]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[7]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[8]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[9]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[10]);
_delay_us(1);
CharToDec(dec);
_delay_us(1);
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);
_delay_ms(300);
}*/
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);
_delay_ms(300);
}
else if (rx_buf[i] == 'P')
{
//MP Текущее состояние плеера
if (rx_buf[4] == 0)
{
//Стоп
LED2_R1;
LED2_G0;
_delay_ms(300);
}
if (rx_buf[4] == 1)
{
//Воспроизведение
LED2_G1;
LED2_R0;
_delay_ms(300);
}
if (rx_buf[4] == 2)
{
//Пауза
LED2_R1;
LED2_G0;
_delay_ms(300);
LED2_G1;
LED2_R0;
_delay_ms(300);
}
}
}
else 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_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);
}
}
}
/*
//Команда AT+M1 запрос номера текущего файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(300);
//Команда AT+M2 запрос общего колличества файлов
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(300);
//Команда AT+MT запрос общего времени воспроизводимого файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('T');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(300);
//Команда AT+MK запрос текущего времени воспроизводимого файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('K');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(300);
*/
if (BTN_PREV)
{
//Команда AT+CD задаём модулю воспроизведение предыдущего трека
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('D');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(500);
}
if (BTN_NEXT)
{
//Команда AT+CC задаём модулю воспроизведение следующего трека
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('C');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(500);
}
if (BTN_VOL_MIN)
{
//Команда AT+CF задаём модулю уменьшение громкости
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('F');
send_UART(0x0D);
send_UART(0x0A);
vol--;
_delay_ms(200);
//Конвертируем значение уровня звука в ASCII
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,1);
}
if (BTN_VOL_PLS)
{
//Команда AT+CE задаём модулю увеличение громкости
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('E');
send_UART(0x0D);
send_UART(0x0A);
vol++;
_delay_ms(200);
//Конвертируем значение уровня звука в ASCII
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,1);
}
if (BTN_MODE)
{
if (mode == 3)
{
//Команда AT+CM01 зададаём модулю режим воспроизведения с BLE
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Устанавливаем значение 1 в переменной mode
mode=1;
}
if (mode == 2)
{
//Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('3');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(20);
//Устанавливаем значение 3 в переменной mode
mode=3;
}
if (mode == 1)
{
//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(20);
//Устанавливаем значение 2 в переменной mode
mode=2;
}
}
if (BTN_PLAY_PAUSE)
{
//Команда AT+CB даём модулю команду PLAY/PAUSE
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('B');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(20);
}
if (BTN_REPEAT)
{
/*
if (repeat == 2)
{
repeat=0;
//Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B0;
}
else
{
repeat=2;
//Команда AT+AC02 воспроизведение в цикле
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y1;
LED4_B0;
}
*/
}
if (BTN_RAND)
{
/*
if (repeat == 3)
{
repeat=0;
//Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B0;
}
else
{
repeat=3;
//Команда AT+AC03 воспроизведение в случайном порядке
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('3');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B1;
}
*/
}
}
}
Сейчас попытался поправить, но это особо не помогло. Не могу понять почему плеер не стартует? Какие ему ещё дать команды нужно? Уже попробовал всякие задержки в промежутках между командами чтобы успевали обработаться данные, но это особо и не помогло. Где искать проблему не понятно абсолютно?
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 11:31:07
Asmodey
Forsio, вы ерундой полнейшей занимаетесь. Без обид, пожалуйста, потому как прикручиваете свой микроконтроллер к еще одному микроконтроллеру, который и без вашего микроконтроллера может в принципе все требуемое делать. И без всяких там команд по uart. Вот эта вот микросхема ACxxxxxxxxxx-25A что на схеме, она в сотни раз производительнее вашей меги16. Мега здесь как собаке 5_я нога или 2_ой хвост.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 11:53:29
Forsio
Asmodey, извините конечно, но мне нужно именно управление из меги и никак иначе. Специально искал такой модуль с которым можно это всё сделать плюс к тому можно вывести на дисплей информацию и к тому же сделать более широкое управление что для меня очень важно. Так что никакая это не ерунда, а вполне хорошее дело. По итогу должен получится очень хороший плеер.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 12:13:56
Asmodey
[uquote="Forsio",url="/forum/viewtopic.php?p=4581877#p4581877"]мне нужно именно управление из меги и никак иначе[/uquote]
Хозяин-барин.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 12:21:55
Forsio
Asmodey, Ну так что знаешь может чего? Подскажешь?
Так то оно по сути понятно что этот плеер уже является самостоятельным, но мне как раз таки нужны расширенные возможности, а в данном модуле их достаточно много и всё управление идёт по UART. От компа через терминал пробовал управлять и вроде как отрабатывает вполне, но с меги пока не получается. Нужно ещё разбираться в чём проблема.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 12:30:04
Asmodey
Конкретно этот модуль (BT201) в руках не держал. Заинтересовался было пару лет назад, тоже хотел его использовать управляя им по uart от PIC микроконтроллера, потом забил.
Скорости uart интерфейса у меги установлена такая же как на компьютере?
P.S. Как вижу, в коде 9600. На компе такая же скорость была?
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 12:40:42
Forsio
Asmodey, в модуле BT201 я сразу переключил скорость на 9600 и в компе с терминала он работает с этой скоростью, но вот с мегой он как то не работает хотя я в коде у меги тоже прописал скорость 9600. Собрано как по схеме в первом сообщении. Как мне рекомендовали установить кварц на 7.3728 MHz. Не знаю насколько это правильно. Может как раз таки и в этом проблема. Потому как нет вообще никакой реакции на команды и при старте идёт цикличный перезапуск модуля.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 12:48:56
Asmodey
[uquote="Forsio",url="/forum/viewtopic.php?p=4581907#p4581907"]Потому как нет вообще никакой реакции на команды и при старте идёт цикличный перезапуск модуля.[/uquote]
Напряжение питания какое? После перезагрузки модуль что-то пишет в терминал?
Добавлено after 4 minutes 22 seconds:
Я не понял. Это ошибка на схеме или так оно и есть - вывод BT_RF на землю через конденсатор закорочен???
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 12:53:52
Forsio
Нет это когда запускаю в связке с мегой идет цикличный перезапуск, а от компа с терминала работает хорошо без проблем. Так что тут нужно искать причину либо в коде либо в схеме. Но я не знаю даже на что думать.
Добавлено after 3 minutes 40 seconds:
Нет там антенна блютус на модуле она так и есть к земле и на вывода через кондёры.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 12:54:10
Asmodey
[uquote="Forsio",url="/forum/viewtopic.php?p=4581911#p4581911"]Нет это когда запускаю в связке с мегой идет цикличный перезапуск[/uquote]
Каким напряжением и от чего питается модуль когда он работает с мегой?
[uquote="Forsio",url="/forum/viewtopic.php?p=4581911#p4581911"]Нет там антенна блютус на модуле она так и есть к земле и на вывода через кондёры.[/uquote]Понятно, на схеме сама антенна на скорую руку изображена.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 13:03:43
Forsio
Asmodey, ну мне уже говорили что это китайская подделка. Много признаков на это указывает, но работает практически так же как и оригинал. Заказал ещё пару модулей в другом месте посмотрю что придёт.
Когда запускаю с мегой питаю от 5 вольт с импульсного блока питания. Хотя когда установлю уже на место питание там будет уже другое, но тоже 5 вольт.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 13:06:15
Asmodey
Питание точно не проседает с этого импульсного? Обычно они ведут себя так (старт-перезагрузка-старт-перезагрузка) когда напряжение ниже 3,6 вольта подается. Включаются, стартуют, а через несколько секунд перезагружаются. Я имею ввиду чипы на которых построены эти BT201.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 13:59:27
Forsio
Asmodey, здесь с питанием точно никаких проблем проверил с двух разных импульсных блоков питания поведение одинаковое, на самих блоках питания чётко 5 вольт. Также проверял от 12 вольтового аккумулятора через 7805. Во всех случаях поведение модуля одинаковое идёт цикличный перезапуск.
Это всё таки я думаю искать нужно причину в схеме. возможно я не попадаю на те частоты с которыми работает модуль BT201 и происходит расхождение.
Re: BT201 последовательность комманд
Добавлено: Вт май 21, 2024 15:01:41
Asmodey
Лог. анализатором посмотреть, что там на uart интерфейсе происходит при передаче команд