历史上的今天
今天是:2024年09月22日(星期日)
2021年09月22日 | 【STM32平衡小车】APP调试协议及代码分析
2021-09-22 来源:eefocus
一、首页界面
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控件名称与发送指令对应对应关系

二、波形界面
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控件名称与发送指令对应对应关系

四、聊天界面

下位机(单片机)发送消息到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);//数组清零
}
}
}
官方说明文档
资料获取 - 提取码:y81g
ASCII码表
史海拾趣
|
最近做了个充电器,BUCK电路中的开关管发热严重,输入是12V的电源。 第一种情况:当充电电压输出为4.2V,电流为500MA的时候开关管发热严重,恒压充电的时候电压恒定4.2v电流慢慢减小这时候开管发热现象减轻。 第二种情况:当充电电压输出为8.4 ...… 查看全部问答> |
|
大家好,我刚刚学单片机一个月了,用买来的学习机做好了许多试验,现在我想自己买元件,从硬件开始设计,我知道该买些元件啊,板子啊,来焊接,但我不懂具体怎么操作,请问有没有讲这方面的书呢,电子方面的啊,谢谢大家推荐… 查看全部问答> |
|
我现在遇到的问题是 ADC12IE = 0x01; 会影响timer_B定时的精度 但是 我查过手册,上面说timer_B高于ADC12中断优先级(先是用的timer_A,发现现象不对) 只要屏蔽ADC12IE = 0x01; 定时就精确了! 求解,求赐教!… 查看全部问答> |
|
请教一下,mma7455 加速度传感器怎么校正,x,y,z校正值是多少?谢谢 [ 本帖最后由 sanxin126 于 2011-7-27 21:09 编辑 ]… 查看全部问答> |
|
自己写了个小程序,把51开发板上的键盘,LCD,串口通信,24C02存储都整合到了一起。程序大致分为两块,一个是串口通信,一个是数据存储、查询。PC可以向单片机发送数据,单片机接受并显示,同时可以将其存储进24C02中。查询模块可以读取24C02中的数 ...… 查看全部问答> |




