课设deadline马上就要到了!可是有个重要功能始终搞不出来!跪求各位路过的大神帮帮忙TT
需实现功能:上位机(visual studio)窗体控制下位机(stm32)播放mp3
上位机发送C到串口,下位机接受到0x43 则切换上一曲
上位机发送D到串口,下位机接受到0x44 则切换下一曲
问题:我把下位机接收数据的代码放在了mp3player.c中控制切换曲目,用上位机控制的时候完全没反应,好像没收到上位机发的数据。。
下位机接收数据控制切换曲目:(mp3player.c)
if(USART_RX_STA&0x8000) { if(USART_RX_BUF[0]==0x43) //上一曲
{ if(curindex)curindex--;
else curindex=totmp3num-1; delay_ms(300); USART_RX_STA=0; } else if(USART_RX_BUF[0]==0x44) //下一曲 { if(curindex<totmp3num) curindex++; else if(curindex>=totmp3num)curindex=0; delay_ms(300); USART_RX_STA=0; } }
然后我把这段换成了简单的上位机控制下位机点灯(LED1)的程序依旧放在mp3player.c 中
if(USART_RX_STA&0x8000) { if(USART_RX_BUF[0]==0x43) { LED1=0; delay_ms(300); USART_RX_STA=0; } else if(USART_RX_BUF[0]==0x44) { LED1=1; delay_ms(300); USART_RX_STA=0; } }
还是没反应。。
接着我把这段注释掉,然后粘贴点灯程序到main.c中,再把播放音乐的功能都注释掉了。。发现虽然要多点几次点灯button 不过还是有反应的。此时上位机窗体可以控制下位机上LED1的亮灭。
// Show_Str(60,170,200,16,"正弦波调试.",16,0); // VS_Sine_Test(); // Show_Str(60,170,200,16,"<<MP3播放器>>",16,0); // begin_min = calendar.min; // mp3_play(); if(USART_RX_STA&0x8000) { if(USART_RX_BUF[0]==0x43) { LED1=0; // if(curindex)curindex--; // else curindex=totmp3num-1; // if(curindex>0)curindex--;//2017/9/30 // else if(curindex==0) curindex=totmp3num-1; delay_ms(300); USART_RX_STA=0; } else if(USART_RX_BUF[0]==0x44) { // if(curindex<totmp3num) curindex++; // else if(curindex>=totmp3num)curindex=0; LED1=1; delay_ms(300); USART_RX_STA=0; } }
但是当我恢复mp3播放功能后,main.c 中的点灯程序也没法用上位机控制了。mp3是可以正常播放音乐的,但是没法切歌了。实在不明白为什么实现不了切歌的功能。
上位机(visual studio的代码):
private void button1_Click(object sender, EventArgs e) { if (port1.IsOpen == true) { port1.DiscardOutBuffer(); port1.WriteLine("C\r\n"); // port1.Close(); } else { port1.Open(); port1.DiscardOutBuffer(); port1.WriteLine("C\r\n"); // port1.Close(); } } private void button3_Click(object sender, EventArgs e) { if (port1.IsOpen == true) { port1.DiscardOutBuffer(); port1.WriteLine("D\r\n"); //port1.Close(); } else { port1.Open(); port1.DiscardOutBuffer(); port1.WriteLine("D\r\n"); // port1.Close(); }