How to read response from serial MP3 player

Hi there
I’m kind of new to serial thinking. Tried to google, but found no answer, I understood.

I have a Serial MP3 player and basic function works fine, thanks to this forum.

But there is a command, that responds with the current state of the player (plying/pausing/…) and I really can’t figure out, how to read this return value out.

The manual says that the command is: 7E 02 10 EF

Command’s without responses was easy to implement.
But when sending the “Get Status” command, nothing happens. How do I catch the response?

Tried something like this in different Orders:

sendCommand(CMD_STATUS, 0X10);
myMP3.write(myMP3.read());

testing = myMP3.read();
Serial.println(tesing);

Or

testing = sendCommand(CMD_STATUS, 0X10);

Here’s the full code so far:

#include <SoftwareSerial.h>

#define ARDUINO_RX 8//should connect to TX of the Serial MP3 Player module
#define ARDUINO_TX 7//connect to RX of the module
SoftwareSerial myMP3(ARDUINO_RX, ARDUINO_TX);

static int8_t Send_buf[6] = {0} ;
/************Command byte**************************/
/*basic commands*/
#define CMD_PLAY  0X01
#define CMD_PAUSE 0X02
#define CMD_NEXT_SONG 0X03
#define CMD_PREV_SONG 0X04
#define CMD_VOLUME_UP   0X05
#define CMD_VOLUME_DOWN 0X06
#define CMD_FORWARD 0X0A // >>
#define CMD_REWIND  0X0B // <<
#define CMD_STOP 0X0E
#define CMD_STOP_INJECT 0X0F//stop interruptting with a song, just stop the interlude

/*5 bytes commands*/
#define CMD_SEL_DEV 0X35
#define DEV_TF 0X01
#define CMD_IC_MODE 0X35
  #define CMD_SLEEP   0X03
  #define CMD_WAKE_UP 0X02
  #define CMD_RESET   0X05

/*6 bytes commands*/  
#define CMD_PLAY_W_INDEX   0X41
#define CMD_PLAY_FILE_NAME 0X42
#define CMD_INJECT_W_INDEX 0X43

/*Special commands*/
#define CMD_SET_VOLUME 0X31
#define CMD_PLAY_W_VOL 0X31

#define CMD_SET_PLAY_MODE 0X33
#define ALL_CYCLE 0X00
#define SINGLE_CYCLE 0X01

#define CMD_PLAY_COMBINE 0X45//can play combination up to 15 songs

#define CMD_STATUS 0X10

void sendCommand(int8_t command, int16_t dat );

int buttonState = 0;
int buttonState_i = 0;
int is_playing = 1;
char player_status;
const int buttonPin = 5;
char testing = 8;
  

void setup() 
{
  myMP3.begin(9600);
  delay(500);                           //Wait chip initialization is complete
  sendCommand(CMD_SEL_DEV, DEV_TF);   //select the TF card  
  delay(200);                           //wait for 200ms
  playWithVolume(0X0501);               //play the first song with volume 15(0x0F) class
  Serial.begin(9600);
    
  pinMode(buttonPin, INPUT);
}

void loop() 
{
  
buttonState_i = digitalRead(buttonPin);

if (buttonState != buttonState_i) {
  buttonState = digitalRead(buttonPin);
  if (buttonState==0) {
    is_playing = !is_playing;
    //Serial.println(is_playing);

    if (is_playing == 1) {
       Serial.println("cmd play");
       playWithVolume(0X0501);
    }else{
       Serial.println("cmd stop");  
       sendCommand(CMD_PAUSE, 0X02);      
    }  
 }
  
}

}

void setVolume(int8_t vol)
{
  mp3_5bytes(CMD_SET_VOLUME, vol);
}
void playWithVolume(int16_t dat)
{
  mp3_6bytes(CMD_PLAY_W_VOL, dat);
}

/*cycle play with an index*/
void cyclePlay(int16_t index)
{
  mp3_6bytes(CMD_SET_PLAY_MODE,index);
}

void setCyleMode(int8_t AllSingle)
{
  mp3_5bytes(CMD_SET_PLAY_MODE,AllSingle);
}


void playCombine(int8_t song[][2], int8_t number)
{
  if(number > 15) return;//number of songs combined can not be more than 15
  uint8_t nbytes;//the number of bytes of the command with starting byte and ending byte
  nbytes = 2*number + 4;
  int8_t Send_buf[nbytes];
  Send_buf[0] = 0x7e; //starting byte
  Send_buf[1] = nbytes - 2; //the number of bytes of the command without starting byte and ending byte
  Send_buf[2] = CMD_PLAY_COMBINE; 
  for(uint8_t i=0; i < number; i++)//
  {
    Send_buf[i*2+3] = song[i][0];
  Send_buf[i*2+4] = song[i][1];
  }
  Send_buf[nbytes - 1] = 0xef;
  sendBytes(nbytes);
}


void sendCommand(int8_t command, int16_t dat = 0)
{
  delay(20);
  if((command == CMD_PLAY_W_VOL)||(command == CMD_SET_PLAY_MODE)||(command == CMD_PLAY_COMBINE))
    return;
  else if(command < 0x10) 
  {
  mp3Basic(command);
  }
  else if(command < 0x40)
  { 
  mp3_5bytes(command, dat);
  }
  else if(command < 0x50)
  { 
  mp3_6bytes(command, dat);
  }
  else return;
 
}

void mp3Basic(int8_t command)
{
  Send_buf[0] = 0x7e; //starting byte
  Send_buf[1] = 0x02; //the number of bytes of the command without starting byte and ending byte
  Send_buf[2] = command; 
  Send_buf[3] = 0xef; //
  sendBytes(4);
}
void mp3_5bytes(int8_t command, uint8_t dat)
{
  Send_buf[0] = 0x7e; //starting byte
  Send_buf[1] = 0x03; //the number of bytes of the command without starting byte and ending byte
  Send_buf[2] = command; 
  Send_buf[3] = dat; //
  Send_buf[4] = 0xef; //
  sendBytes(5);
}
void mp3_6bytes(int8_t command, int16_t dat)
{
  Send_buf[0] = 0x7e; //starting byte
  Send_buf[1] = 0x04; //the number of bytes of the command without starting byte and ending byte
  Send_buf[2] = command; 
  Send_buf[3] = (int8_t)(dat >> 8);//datah
  Send_buf[4] = (int8_t)(dat); //datal
  Send_buf[5] = 0xef; //
  sendBytes(6);
}
void sendBytes(uint8_t nbytes)
{
  for(uint8_t i=0; i < nbytes; i++)//
  {
    myMP3.write(Send_buf[i]) ;
  }
}

Thanks alot for helping me starting over with serialism.

Leon

Hi again
Addiction got me and could not stop riddling.
Finally found out, that the keyword to google after is HEX.

This thread solved my problem:

By now this code works for me to go further:

if (myMP3.available())
{
sendCommand(CMD_STATUS, 0X10);
for (int i = 0; i < 16; i++) {
while (!myMP3.available()); // wait for a character
     
player_status = myMP3.read();
Serial.print(player_status, HEX);
}
Serial.println(' ');
}

I am using an Open Smart Serial MP3 Player A (probably 1.1). I want to make a Toddler-Jukebox that can only be switched on and off. I want it to always start over with the song out of 12 it played before. Because to the limitations of the module, it’s not possible to get the current song. the only way to save the current song is to continuously get the state to recognize when it stoped after playing a song and requesting the next file by increasing a variable and saving it.

Will post the Toddle-Jukebox-Code when finnished.

Happy coding,
Leon

//Learniungs for other Serial-Newbies like me:

The mentioned post made me understand, that serial or hex or how ever you call this communication is very portioned. You dont get or send a string, even if samplecode, using libraries, is suggesting this.