【STM32平衡小車】APP調(diào)試協(xié)議及代碼分析
文章目錄
一、首頁界面
二、波形界面
三、調(diào)試界面
四、聊天界面
五、代碼
printf("{A%d:%d:%d:%d}$",a,b,c,d);
a、b、c、d分別為需要顯示的狀態(tài):
a對應(yīng)左邊的碼盤,b對應(yīng)右邊的碼盤,通過百分比表示,可以用于速度等狀態(tài)的顯示,范圍是0—100(%)
c主要是用于顯示電量,范圍也是0—100(%)
d是角度值,范圍是-180°—180°。
APP控件名稱與發(fā)送指令對應(yīng)對應(yīng)關(guān)系
printf("{B%d:%d:%d:%d:%d}$",a,b,c,d,e);
5個波形通道!
a、b、c、d、e 為需要顯示的波形,發(fā)送的參數(shù)必須為整型變量,如果需要顯示浮點數(shù),放大一定的倍數(shù)之后再打印出來。
需要注意的是,每個通道發(fā)送的數(shù)據(jù)不可超過 5 個,但是可以少于 5 個。
printf("{B%d:%d:%d:%d:%d:%d:%d:%d:%d}$",a,b,c,d,e,f,g,h,i);
調(diào)試界面可以進(jìn)行 9 個通道【0-8】的參數(shù)調(diào)節(jié),點擊每個通道的文字,可以編輯該通道的名稱、調(diào)節(jié)范圍、數(shù)值等。點擊右上方的菜單按鈕,可以彈出設(shè)置界面。
【實時發(fā)送參數(shù)】,使能后在推動滑塊到某一位置松開手便發(fā)送相應(yīng)的參數(shù)。
【發(fā)送所有參數(shù)】,上述【實時發(fā)送參數(shù)】如果不使能,則需要點擊下方的,一起發(fā)送 9 個通道的數(shù)據(jù)。(注意:程序暫時沒有處理這個發(fā)送所有參數(shù))
【掉電保存參數(shù)】,主要是把調(diào)節(jié)好的參數(shù),寫入下位機的 Flash 或者 EEPROM 等,實現(xiàn)掉電保存。
【獲取設(shè)備參數(shù)】,可以接收下位機的參數(shù)并更新到當(dāng)前的調(diào)節(jié)界面。接收該指令之后,下位機需要把參數(shù)打印出來。
APP控件名稱與發(fā)送指令對應(yīng)對應(yīng)關(guān)系
下位機(單片機)發(fā)送消息到APP,格式參考:printf("{#hello world}$");
APP發(fā)送消息到下位機(單片機)可直接發(fā)送。
/************************************************************************** 函數(shù)功能:串口3接收中斷 入口參數(shù):無 返回 值:無 **************************************************************************/ void USART3_IRQHandler(void) { if(USART3->SR&(1<<5))//接收到數(shù)據(jù) { static u8 Flag_PID,i,j,Receive[50]; static float Data; Usart3_Receive=USART3->DR; APP_RX=Usart3_Receive; if(Usart3_Receive>=0x41&&Usart3_Receive<=0x48)//0x41-'A'...0x48-'H' Flag_Direction=Usart3_Receive-0x40; else if(Usart3_Receive<10) Flag_Direction=Usart3_Receive; else if(Usart3_Receive==0x5A)//0x5A-'Z' Flag_Direction=0; //以下是與APP調(diào)試界面通訊 if(Usart3_Receive==0x7B) Flag_PID=1; //APP參數(shù)指令起始位 - 0x7B對應(yīng)的ASCII是'{' if(Usart3_Receive==0x7D) Flag_PID=2; //APP參數(shù)指令停止位 - 0x7D對應(yīng)的ASCII是'}' if(Flag_PID==1) //采集數(shù)據(jù) 將APP參數(shù)指令保存到Receive數(shù)組中,包括`{`但不包括'}' { Receive[i]=Usart3_Receive; i++; } if(Flag_PID==2) //分析數(shù)據(jù) { if (Receive[3]==0x50) PID_Send=1; //0x7D對應(yīng)的ASCII是'P' else if(Receive[3]==0x57) Flash_Send=1; //0x57對應(yīng)的ASCII是'W' else if(Receive[1]!=0x23) //0x23對應(yīng)的ASCII是'#' 對應(yīng)APP拖動滑塊然后松手發(fā)送參數(shù)到下位機(單片機)的操作 { for(j=i;j>=4;j--)//假如發(fā)送指令為{0:120},該for循環(huán)的作用是取出120 { Data+=(Receive[j-1]-48)*pow(10,i-j);//注意此處的49對應(yīng)0x30 } switch(Receive[1])//對應(yīng)的通道 { case 0x30: Bluetooth_Velocity=Data;break; case 0x31: Velocity_KP=Data;break; case 0x32: Velocity_KI=Data;break; case 0x33: break; case 0x34: break; case 0x35: break; case 0x36: break; case 0x37: break; //預(yù)留 case 0x38: break; //預(yù)留 } } Flag_PID=0;//相關(guān)標(biāo)志位清零 i=0; j=0; Data=0; memset(Receive, 0, sizeof(u8)*50);//數(shù)組清零 } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
官方說明文檔
資料獲取 - 提取碼:y81g
ASCII碼表
TCP/IP 移動APP
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。