关于使用DFRobot的Mini MP3 Player的串口指令

        最近在使用Arduino做一个项目,需要播放MP3文件,通过比较之后采用DFRobot的MP3 Player,它通过串口指令控制,可以制定曲目播放。在使用的过程中遇到一些小问题,特此记录。

关于使用DFRobot的Mini MP3 Player的串口指令_第1张图片

关于使用DFRobot的Mini MP3 Player的串口指令_第2张图片

       上面是官方文档中串口指令的格式,大部分没什么问题,除了校验和计算的那部分。理论上校验和是数据相加之后再取反,比如play的指令,0x7E0xFF 0x06 0x0D 0x00 0x00 0x00 0xXX 0xXX 0xEF,不计开始和结束部分(红色字部分)的数据和是0x0112,按位取反之后为0xFEED,所以完整的指令应该为:

0x7E 0xFF 0x06 0x0D 0x00 0x00 0x00 0xFE 0xED 0xEF

而实际上官方的库文件总给出的play指令如下,这个指令才能让MP3播放:

0x7E 0xFF 0x06 0x0D 0x00 0x00 0x00 0xFE 0xEE 0xEF

官方库的的校验和计算为:

	uint8_t checksum = 0;
	<span style="color:#ff0000;">for (int i=2; i<8; i++) {
		checksum += cmd[i];
	}</span>
	<span style="color:#3366ff;">cmd[8] = (uint8_t)~checksum;</span>
	for (int i=0; i<10; i++) { //send cmd
		(*mySerial).write (cmd[i]);
	}
}
这种方法与文档上描述的不一致,校验位的高八位都没计算,总是0xFE,我采用下面方法:

        uint16_t checksum = 0;
	<span style="color:#ff0000;">for (int i=1; i<7; i++) {
		checksum += cmd[i];
	}</span>
	<span style="color:#3366ff;">uint16_t leftsum = 0x010000 - checksum;
	cmd[7] = (uint8_t)(leftsum >> 8);
	cmd[8] = (uint8_t)(leftsum);</span>
	for (int i=0; i<10; i++) { //send cmd
		(*mySerial).write (cmd[i]);
	}

这样算出来的结果与官方库程序的计算结果一致,不过更符合文档对校验位的描述。

PS:感觉淘宝卖家比较坑,给的库文件都有问题,这个网站上的资料靠谱一些:

http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0299)DFPlayer_Mini%E6%A8%A1%E5%9D%97



你可能感兴趣的:(mp3,arduino)