最近在使用Arduino做一个项目,需要播放MP3文件,通过比较之后采用DFRobot的MP3 Player,它通过串口指令控制,可以制定曲目播放。在使用的过程中遇到一些小问题,特此记录。
上面是官方文档中串口指令的格式,大部分没什么问题,除了校验和计算的那部分。理论上校验和是数据相加之后再取反,比如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