一、數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)
數(shù)據(jù)的傳輸我們可以稍微參考一些網(wǎng)絡(luò)協(xié)議咬最,一段數(shù)據(jù)在傳輸過(guò)程中可能會(huì)由于各種原因使得數(shù)據(jù)不能正確被接收翎嫡,那么一個(gè)好的數(shù)據(jù)結(jié)構(gòu)和傳輸機(jī)制將會(huì)讓數(shù)據(jù)傳輸更有保障。
struct spi_data{
char sync_byte;//同步位永乌,數(shù)據(jù)的開(kāi)始
spicmd cmd;//命令惑申,數(shù)據(jù)的意義
uint16 seq;//數(shù)據(jù)的序號(hào),用于確保該條數(shù)據(jù)正確被接收
uint16 context;//命令內(nèi)容
uint16 crc;//crc檢驗(yàn)數(shù)據(jù)的完整
}//spi傳輸中的數(shù)據(jù)幀
enum spicmd{
req_send 0x0000;//請(qǐng)求發(fā)送數(shù)據(jù)命令
req_start;//音頻的開(kāi)始
req_end;//音頻的結(jié)束
rsp_oknext;//數(shù)據(jù)正確接收翅雏,請(qǐng)發(fā)下一條
rsp_resend;//數(shù)據(jù)接收有誤圈驼,請(qǐng)重發(fā)
}
enum decodetype{
mp3 0x0000;
aac;
wav;
m4a;
…
}//音頻格式枚舉
二、傳輸流程機(jī)制
當(dāng)發(fā)送一個(gè)音頻的時(shí)候望几,我們有必要在第一條數(shù)據(jù)中發(fā)送音頻的必須信息(例:格式绩脆、名稱、大小……)
發(fā)送第一條數(shù)據(jù)(例:test.mp3)
uint8 send_buffer[512];
char *audioname="test.mp3";
struct spidata * startdata=(struct spidata *)malloc(sizeof(spidata)); startdata->sybc_byte='S';
startdata->cmd=req_start;
startdata->seq=1;
startdata->context=sizeof(mp3)+strlen(audioname);
startdata->crc=getCrc(&spidata,sizeof(spidata)-sizeof(spidata.crc)); send_buffer[0]='S';//同步位
send_buffer[1]=mp3; mencpy(send_buffer+2,audioname,strlen(audioname));
(uint16 *)(send_buffer+strlen(audioname)+2)=getCrc(send_buffer,strlen(send_buffer)-1);
發(fā)送該數(shù)據(jù)直至slave返回?cái)?shù)據(jù)橄抹。 當(dāng)slave接收到數(shù)據(jù)靴迫,將會(huì)根據(jù)數(shù)據(jù)正確與否回復(fù)。
1楼誓、當(dāng)數(shù)據(jù)正確回復(fù):
struct spidata *response=(struct spidata *)malloc(sizeof(spidata)); response->sync_byte='S';
response->cmd=rsp_oknext;
response->seq=1;
response->crc=getCrc(response,sizeof(spidata)-1);
2玉锌、當(dāng)數(shù)據(jù)檢驗(yàn)crc錯(cuò)誤回復(fù):
response->cmd=rsp_resend;
主機(jī)master接收到slave回復(fù)后,根據(jù)回復(fù)cmd和seq序號(hào)確保上一條數(shù)據(jù)是否正確到達(dá)疟羹。
1主守、當(dāng)收到slave回復(fù)cmd=rsp_oknext
禀倔,master就發(fā)送下一條數(shù)據(jù)(音頻數(shù)據(jù))cmd=req_send
。
2丸逸、當(dāng)收到slaver回復(fù)cmd=rsp_resend
蹋艺,master就重新發(fā)送該條數(shù)據(jù)剃袍。 當(dāng)發(fā)送音頻最后一段數(shù)據(jù)時(shí)黄刚,我們應(yīng)該發(fā)送描述音頻結(jié)束的數(shù)據(jù),以確保接收端知道數(shù)據(jù)的終結(jié)民效。 master只需發(fā)送攜帶cmd=req_end
指令 即可憔维,slave根據(jù)該cmd結(jié)束接收。