【STM32平衡小车】APP调试协议及代码分析

举报
ReCclay 发表于 2022/02/21 23:54:33 2022/02/21
【摘要】 文章目录 一、首页界面二、波形界面三、调试界面四、聊天界面五、代码 一、首页界面 printf("{A%d:%d:%d:%d}$",a,b,c,d); a、b...

一、首页界面

printf("{A%d:%d:%d:%d}$",a,b,c,d);

a、b、c、d分别为需要显示的状态:

  • a对应左边的码盘,b对应右边的码盘,通过百分比表示,可以用于速度等状态的显示,范围是0—100(%)
  • c主要是用于显示电量,范围也是0—100(%)
  • d是角度值,范围是-180°—180°。

在这里插入图片描述

APP控件名称与发送指令对应对应关系

名称 指令
减速 Y
加速 X
正前 A
右前 B
正右 C
右下 D
正下 E
左下 F
正左 G
左前 H
中间 Z
二、波形界面

printf("{B%d:%d:%d:%d:%d}$",a,b,c,d,e);

5个波形通道!

a、b、c、d、e 为需要显示的波形,发送的参数必须为整型变量,如果需要显示浮点数,放大一定的倍数之后再打印出来。

需要注意的是,每个通道发送的数据不可超过 5 个,但是可以少于 5 个。

在这里插入图片描述

三、调试界面

printf("{B%d:%d:%d:%d:%d:%d:%d:%d:%d}$",a,b,c,d,e,f,g,h,i);

调试界面可以进行 9 个通道【0-8】的参数调节,点击每个通道的文字,可以编辑该通道的名称、调节范围、数值等。点击右上方的菜单按钮,可以弹出设置界面。

在这里插入图片描述
在这里插入图片描述

  • 【实时发送参数】,使能后在推动滑块到某一位置松开手便发送相应的参数。

【发送所有参数】,上述【实时发送参数】如果不使能,则需要点击下方的,一起发送 9 个通道的数据。(注意:程序暂时没有处理这个发送所有参数)

  • 【掉电保存参数】,主要是把调节好的参数,写入下位机的 Flash 或者 EEPROM 等,实现掉电保存。

  • 【获取设备参数】,可以接收下位机的参数并更新到当前的调节界面。接收该指令之后,下位机需要把参数打印出来。

APP控件名称与发送指令对应对应关系

名称 指令
获取设备参数 {Q:P}
掉电保存参数 {Q:W}
发送所有参数(#后面对应9个参数) {#30:12:12:0:0:0:0:0:0}
将参数0条滑块推动至30 {0:30}
将参数1条滑块推动至12 {1:12}
四、聊天界面

在这里插入图片描述

  • 下位机(单片机)发送消息到APP,格式参考:printf("{#hello world}$");
  • APP发送消息到下位机(单片机)可直接发送。
五、代码
/**************************************************************************
函数功能:串口3接收中断
入口参数:无
返回  值:无
**************************************************************************/
void USART3_IRQHandler(void)
{	
	if(USART3->SR&(1<<5))//接收到数据
	{	  
		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调试界面通讯
		if(Usart3_Receive==0x7B) Flag_PID=1;   //APP参数指令起始位 - 0x7B对应的ASCII是'{'
		if(Usart3_Receive==0x7D) Flag_PID=2;   //APP参数指令停止位 - 0x7D对应的ASCII是'}'

		if(Flag_PID==1)  //采集数据 将APP参数指令保存到Receive数组中,包括`{`但不包括'}'
		{
			Receive[i]=Usart3_Receive;
			i++;
		}
		if(Flag_PID==2)  //分析数据
		{
			if		(Receive[3]==0x50) 	 PID_Send=1;	//0x7D对应的ASCII是'P'
			else  if(Receive[3]==0x57) 	 Flash_Send=1;	//0x57对应的ASCII是'W'
			else  if(Receive[1]!=0x23) 					//0x23对应的ASCII是'#'  对应APP拖动滑块然后松手发送参数到下位机(单片机)的操作
			{								
				for(j=i;j>=4;j--)//假如发送指令为{0:120},该for循环的作用是取出120
				{
					Data+=(Receive[j-1]-48)*pow(10,i-j);//注意此处的49对应0x30
				}
				switch(Receive[1])//对应的通道
				{
					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; //预留
					case 0x38:  break; //预留
				}
			}				 
			Flag_PID=0;//相关标志位清零
			i=0;
			j=0;
			Data=0;
			memset(Receive, 0, sizeof(u8)*50);//数组清零
		} 	 			
	}  											 
} 

  
 
  • 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

在这里插入图片描述

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/84203687

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。