Bootstrap

【经验篇】匿名上位机4.34简单上手

昨天想用匿名上位机测下mpu6050原始数据,找了些资料,但网上也没有很详细讲解的例子,都是直接用的那种

首先,上位机不同版本的协议可能是不一样的,打开后按f12可以查看帮助,我一开始用的2.6版本,帮助说明有点模糊,看不明白里面的数据帧是怎么定义的,比如fun,网上不同资料前四字节往往不一样。2.6高级收码帮助如下

 二:高级收码
1:收码显示为HEX格式。
2:下位机发送自定义数据,格式为:0x88+FUN+LEN+DATA+SUM
      FUN可以是 0xA1到0xAA,共10个;LEN为DATA的长度(不包括0x88、FUN、LEN、SUM)。
      SUM是0x88一直到DATA最后一字节的和,uint8格式。
    (记得打开需要使用帧的开关,更改设置后点击保存设置使设置生效)
3:数据可以是uint8、int16、uint16、int32、float这几个常用格式,多字节数据高位在前。
4:共有20个数据存储器,每个存储器的数据可以分别设置为来自10个自定义帧的30个数据。
5:高速通讯时(2ms一帧数据或者更快),请关闭高级收码页面的数据显示按钮和基本收码,否则更新过快有可
      能会造成程序卡死。
6:飞控显示对应的帧FUN为0xAF,(帧格式:0x88+0xAF+0x1C+ACC DATA+GYRO DATA+MAG DATA+ANGLE DATA
      + 0x00 0x00 + 0x00 0x00+SUM,共32字节,ACC/GYRO/MAG/ANGLE(roll/pitch/yaw)数据为int16格式,其
      中ANGLE的roll和pitch数据为实际值乘以100以后得到的整数值,yaw为乘以10以后得到的整数值,
      上位机在显示时再 除以100和10)。
7:遥控,电机pwm,电压显示对应的帧FUN为0xAE,(帧格式:0x88+0xAE+0x12+THROT YAW ROLL PITCH 
      +AUX1 2 3 4 5 + PWM:1 2 3 4 + VOTAGE + SUM,共28字节),数据为uint16格式,遥控数据最小在1000左右,
      最大在2000左右。数据都为uint16格式,其中pwm范围1-100,votage为实际值*100。
      小技巧:如果高速通讯时是为了画波形,就只开波形显示,并只保留需要观察的波形,如果是为了观察数
      据,就关闭波形显示,只保留收码显示,这样可以加快程序响应速度。
7:最快通讯速度测试过下位机用500K波特率,每1ms发送32字节的数据,上位机显示其中6条波形,OK!
    (有可能和电脑配置有关)
 

晕了很久,然后下载了4.34版本,因为功能更加完善,并且帮助说明更加详细。下面是协议的用户部分:

 

协议版本:V4.01
▲SUM等于从该数据帧第一字节开始,也就是帧头开始,至该帧数据的最后一字节所有字节的和,只保留低八位,高位舍去。
▲协议中长度字节LEN表示该数据帧内包含数据的字节总长度,不包括帧头、功能字、长度字节和最后的校验位,只是数据的字节长度和。比如该帧数据内容为3个int16型数据,那么LEN等于6
▲返回校验是YES的,飞控在收到该帧数据后,需要立即返回CHECK数据帧,也就是AAAAEF数据帧。
▲若使用HID方式进行通信,推荐数据包长度64字节,每个数据包第一字节表示本包数据有效数据的长度,从1到63.
飞控->上位机 上位机(遥控)->飞控
 
帧头功能字长度数据校验备注 帧头功能字长度数据校验返回校验备注
VERAAAA00LENuint8  HardwareType硬件种类
uint16 HardwareVER*100硬件版本
uint16 SoftwareVER*100软件版本
uint16 ProtocolVER*100协议版本
uint16 BootloaderVER*100
SUM版本信息         
STATUSAAAA01LENint16 ROL*100
int16 PIT*100
int16 YAW*100
int32 ALT_USE(高度cm)
uint8 FLY_MODEL(飞行模式)
u8 ARMED : 0加锁 1解锁
SUM飞机姿态等基本信息 CONMANDAAAF011uint8 CMD1SUMYES命令集合1
01:ACC校准
02:GYRO校准

04:MAG校准
05:BARO校准

20:退出6面校准
21:6面校准第1步
22:6面校准第2步
23:6面校准第3步
24:6面校准第4步
25:6面校准第5步
26:6面校准第6步

A0:飞控锁定(仅用于手机蓝牙控制)
A1:飞控解锁(仅用于手机蓝牙控制)
SENSERAAAA0218int16 ACC_X
int16 ACC_Y
int16 ACC_Z
int16 GYRO_X
int16 GYRO_Y
int16 GYRO_Z
int16 MAG_X
int16 MAG_Y
int16 MAG_Z
SUM飞机传感器数据 ACKAAAF021uint8 CMD2SUMYES命令集合2
01:读取PID请求(返回AAAA 10\11\12\13\14\15数据帧)
02:读取飞行模式设置请求(返回AAAA 0A数据帧)
21:读取飞控内航点数量(返回AAAA 20数据帧)
30:读取无线定位模块设置
40:读取数传模块设置
A0:读取下位机版本信息(返回AAAA 00数据帧)
A1:恢复默认参数
RCDATAAAAA0320int16 THR
int16 YAW
int16 ROL
int16 PIT
int16 AUX1
int16 AUX2
int16 AUX3
int16 AUX4
int16 AUX5
int16 AUX6
SUM飞机收到的控制数据 RCDATAAAAF0320int16 THR
int16 YAW
int16 ROL
int16 PIT
int16 AUX1
int16 AUX2
int16 AUX3
int16 AUX4
int16 AUX5
int16 AUX6
SUMNO飞行控制数据(仅用于微型飞机,无刷飞机请用航模遥控控制)
GPSDATAAAAA04LEN参见数据定义->当前位置信息SUM机载GPS 信息  AAAF04LEN SUMNO 
POWERAAAA05LENuint16 Votage*100
uint16 Current*100
SUM   AAAF05LEN SUMNO 
MOTO 06LENuint16 PWM_MOTO12345678SUM马达PWM(范围0-
1000)
  AAAF06LEN SUMNO 
SENSER2AAAA07LENint32 ALT_BAR(推荐为cm单位)
uint16 ALT_CSB(超声波高度cm)
SUM   AAAF07LEN SUMNO 
 AAAA08LEN SUM   AAAF08LEN SUMNO 
 AAAA09LEN SUM   AAAF09LEN SUMNO 
FLY
MODEL
AAAA0ALENint8 AUX1_LOW_MODEL
int8 AUX1_MID_MODEL
int8 AUX1_HIG_MODEL
int8 AUX2_LOW_MODEL
int8 AUX2_MID_MODEL
int8 AUX2_HIG_MODEL
int8 AUX3_LOW_MODEL
int8 AUX3_MID_MODEL
int8 AUX3_HIG_MODEL
SUM飞行模式 FLY
MODEL
AAAF0ALENint8 AUX1_LOW_MODEL
int8 AUX1_MID_MODEL
int8 AUX1_HIG_MODEL
int8 AUX2_LOW_MODEL
int8 AUX2_MID_MODEL
int8 AUX2_HIG_MODEL
int8 AUX3_LOW_MODEL
int8 AUX3_MID_MODEL
int8 AUX3_HIG_MODEL
SUMYES飞行模式
 AAAA0BLENint16 SPEED_ROL
int16 SPEED_PIT
int16 SPEED_Z(单位cm)
SUM   AAAF0BLEN SUM  
 AAAA0CLEN SUM   AAAF0CLEN SUM  
 AAAA0DLEN SUM   AAAF0DLEN SUM  
 AAAA0ELEN SUM   AAAF0ELEN SUM  
 AAAA0FLEN SUM   AAAF0FLEN SUM  
PID1AAAA1018int16 PID1_P
int16 PID1_I
int16 PID1_D
int16 PID2_P
int16 PID2_I
int16 PID2_D
int16 PID3_P
int16 PID3_I
int16 PID3_D
SUMPID数据帧1 PID1AAAF1018int16 PID1_P
int16 PID1_I
int16 PID1_D
int16 PID2_P
int16 PID2_I
int16 PID2_D
int16 PID3_P
int16 PID3_I
int16 PID3_D
SUMYESPID数据帧1到6

共有18组PID,每3组PID组成一个PID数据帧,所以共6个PID数据帧
PID2AAAA1118int16 PID4_P
int16 PID4_I
int16 PID4_D
int16 PID5_P
int16 PID5_I
int16 PID5_D
int16 PID6_P
int16 PID6_I
int16 PID6_D
SUMPID数据帧2 PID2AAAF1118int16 PID4_P
int16 PID4_I
int16 PID4_D
int16 PID5_P
int16 PID5_I
int16 PID5_D
int16 PID6_P
int16 PID6_I
int16 PID6_D
SUMYES
PID3AAAA1218int16 PID7_P
int16 PID7_I
int16 PID7_D
int16 PID8_P
int16 PID8_I
int16 PID8_D
int16 PID9_P
int16 PID9_I
int16 PID9_D
SUMPID数据帧3 PID3AAAF1218int16 PID7_P
int16 PID7_I
int16 PID7_D
int16 PID8_P
int16 PID8_I
int16 PID8_D
int16 PID9_P
int16 PID9_I
int16 PID9_D
SUMYES
PID4AAAA1318int16 PID10_P
int16 PID10_I
int16 PID10_D
int16 PID11_P
int16 PID11_I
int16 PID11_D
int16 PID12_P
int16 PID12_I
int16 PID12_D
SUMPID数据帧4 PID4AAAF1318int16 PID10_P
int16 PID10_I
int16 PID10_D
int16 PID11_P
int16 PID11_I
int16 PID11_D
int16 PID12_P
int16 PID12_I
int16 PID12_D
SUMYES
PID5AAAA1418int16 PID13_P
int16 PID13_I
int16 PID13_D
int16 PID14_P
int16 PID14_I
int16 PID14_D
int16 PID15_P
int16 PID15_I
int16 PID15_D
SUMPID数据帧5 PID5AAAF1418int16 PID13_P
int16 PID13_I
int16 PID13_D
int16 PID14_P
int16 PID14_I
int16 PID14_D
int16 PID15_P
int16 PID15_I
int16 PID15_D
SUMYES
PID6AAAA1518int16 PID16_P
int16 PID16_I
int16 PID16_D
int16 PID17_P
int16 PID17_I
int16 PID17_D
int16 PID18_P
int16 PID18_I
int16 PID18_D
SUMPID数据帧6 PID6AAAF1518int16 PID16_P
int16 PID16_I
int16 PID16_D
int16 PID17_P
int16 PID17_I
int16 PID17_D
int16 PID18_P
int16 PID18_I
int16 PID18_D
SUMYES
 AAAA16LEN SUM   AAAF16LEN SUM  
 AAAA17LEN SUM   AAAF17LEN SUM  
 AAAA LEN SUM   AAAF LEN SUM  
 AAAA LEN SUM   AAAF LEN SUM  
FP_NUMAAAA20LENuing16 FP_NUMSUM飞控已有航点数量 READ_FPAAAF20LENuint16 FP_CNTSUM 读取第CNT个航点信息
FPAAAA21LEN参见数据定义->航点信息SUM航点信息 FPAAAF21LEN参见数据定义->航点信息SUMYES写入航点信息
 AAAA LEN SUM   AAAF LEN SUM  
 AAAA LEN SUM   AAAF LEN SUM  
Distances
测距数据
AAAA30LENuint8  ANCHOR_ACTIVE
uint16 DIST_FL
uint16 DIST_FR
uint16 DIST_BL
uint16 DIST_BR
uint16 ALT_L_1
uint16 ALT_L_2
SUM单位:cm
ANCHOR_ACTIVE:
从最低位到最高位,依次表示1到6号基站是否连接正常
DIST_FL:
左前基站距离
DIST_FR:
右前基站距离
DIST_BL:
左后基站距离
DIST_BR:
右后基站距离
ALT_L_1:
高度1
ALT_L_2:
高度2
  AAAF30LEN SUM  
D_Distances
测距差分
AAAA31LENuint8  ANCHOR_ACTIVE
int16 DIST_FL_D
int16 DIST_FR_D
int16 DIST_BL_D
int16 DIST_BR_D
int16 ALT_L_1_D
int16 ALT_L_2_D
SUM单位:cm
距离信息的差分输出
  AAAF31LEN SUM  
Location
位置数据
AAAA32LENint16 LOC_X
int16 LOC_Y
int16 LOC_Z
SUM单位:cm
LOC_X/Y/Z:
解算出的位置信息
  AAAF32LEN SUM  
D_Location
位置差分
AAAA33LENint16 LOC_X_D
int16 LOC_Y_D
int16 LOC_Z_D
SUM单位:cm
位置信息差分输出
  AAAF33LEN SUM  
 AAAA34LEN SUM   AAAF34LEN SUM  
 AAAA35LEN SUM   AAAF35LEN SUM  
 AAAA36LEN SUM   AAAF36LEN SUM  
 AAAA37LEN SUM   AAAF37LEN SUM  
 AAAA38LEN SUM   AAAF38LEN SUM  
 AAAA39LEN SUM   AAAF39LEN SUM  
Location
Set
AAAA3ALENuint8_t MODE
uint8_t ANCHOR_CNT
uint16_t WIDTH *100
uint16_t LENGTH *100
uint16_t HEIGHT *100
SUM  Location
Set
AAAF3ALENuint8_t MODE
uint8_t ANCHOR_CNT
uint16_t WIDTH *100
uint16_t LENGTH *100
uint16_t HEIGHT *100
SUM  
Location
Set2
AAAA3BLENuint8_t ANCHOR_NUM
uint8_t RUN_MODE
uint8_t FILTER_SET
uint16_t CAL*100
int16_t OFFSET_X*100
int16_t OFFSET_Y*100
int16_t OFFSET_Z*100
uint32_t UART_BAUD
uint8_t ENABLE_INS
uint8_t OUT_SELECT
SUM  Location
Set2
AAAF3BLENuint8_t ANCHOR_ENABLE
uint8_t RUN_MODE
uint8_t FILTER_SET
uint16_t CAL*100
int16_t OFFSET_X*100
int16_t OFFSET_Y*100
int16_t OFFSET_Z*100
uint32_t UART_BAUD
uint8_t ENABLE_INS
uint8_t OUT_SELECT
SUM ANCHOR_ENABLE:
从最低位到最高位,依次表示1到6号基站是否启用
OUT_SELECT:
bit0:距离信息输出
bit1:距离差分输出
bit2:位置信息输出
bit3:位置差分输出
 AAAA3CLEN SUM   AAAF3CLEN SUM  
 AAAA LEN SUM   AAAF LEN SUM  
RadioLink
Set
AAAA40LENu8  RL_RUN_MODE
u8  RL_ENABLE_UART
u32 RL_UART_BAUD
u8  RL_AIR_SPEED
u8  RL_LOCAL_ADDR_0
u8  RL_LOCAL_ADDR_1
u8  RL_LOCAL_ADDR_2
u8  RL_REMOTE_ADDR_0
u8  RL_REMOTE_ADDR_1
u8  RL_REMOTE_ADDR_2
u8  RL_CH
u8  RL_ARC
SUM  RadioLink
Set
AAAF40LENu8  RL_RUN_MODE
u8  RL_ENABLE_UART
u32 RL_UART_BAUD
u8  RL_AIR_SPEED
u8  RL_LOCAL_ADDR_0
u8  RL_LOCAL_ADDR_1
u8  RL_LOCAL_ADDR_2
u8  RL_REMOTE_ADDR_0
u8  RL_REMOTE_ADDR_1
u8  RL_REMOTE_ADDR_2
u8  RL_CH
u8  RL_ARC
SUM  
 AAAA LEN SUM   AAAF LEN SUM  
 AAAA LEN SUM   AAAF LEN SUM  
 AAAA LEN SUM   AAAF LEN SUM  
 AAAA LEN SUM   AAAF LEN SUM  
 AAAA LEN SUM  CAM
CONTROL
AAAF8013uint8  OBJ1_OK =1可用=0不可用
uint16 OBJ1_X
uint16 OBJ1_Y
uint8  OBJ2_OK
uint16 OBJ2_X
uint16 OBJ2_Y
uint8  ALT_OK
uint16 ALT
SUMNO摄像头控制数据
OBJ1用于定位
OBJ2用于计算航向
ALT为高度数据
MSGAAAAEE7uint8_t MSG_ID
uint8_t MSG_DATA
SUMMSG_ID:
01:加速度
02:陀螺仪
03:罗盘
30:无线定位模块
40:匿名数传

MSG_DATA:
01:校准成功
E1:校准失败
31:设置成功
32:设置成功2
A1:恢复默认成功
  AAAF LEN SUM  
CHECKAAAAEF7uint8  FREAM_HEAD 帧头
uint8  CHECK_SUM 和校验
SUM比如要返回PID1数据帧的校验数据,FREAM_HEAD=0x10,CHECK_SUM=接收到PID1数据帧计算出的SUM  AAAF LEN SUM  
 AAAAF0LEN SUM  IAPAAAFF0LENuint16 BOOT_STASUMNO立即进入IAP功能:
BOOT_STA=0xFFFA
USER_DATAAAAAF1LEN自定义SUM用户数据  AAAF LEN SUM  
USER_DATAAAAAF2LEN自定义SUM用户数据         
USER_DATAAAAAF3LEN自定义SUM用户数据         
USER_DATAAAAAF4LEN自定义SUM用户数据         
USER_DATAAAAAF5LEN自定义SUM用户数据         
USER_DATAAAAAF6LEN自定义SUM用户数据         
USER_DATAAAAAF7LEN自定义SUM用户数据         
USER_DATAAAAAF8LEN自定义SUM用户数据         
USER_DATAAAAAF9LEN自定义SUM用户数据         
USER_DATAAAAAFALEN自定义SUM用户数据  AAAF LEN SUM  

这个讲的就很清楚了,我使用的只是自定义的用户数据 :帧头aaaa+功能字f1+数据长度len+自定义的数据+校验sum

下面是我的帧格式数据,发送的12个u8用户数据,总共17个u8数据:

#ifndef _anonymity_h
#define _anonymity_h

#include "bsp_usart.h"

/**********为了匿名四轴上位机的协议定义的变量****************************/
//cup为小端模式存储,也就是在存储的时候,低位被存在0字节,高位在1字节
#define BYTE0(dwTemp)       (*(char *)(&dwTemp))     //取出int型变量的低字节
#define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))     //    取存储在此变量下一内存字节的内容,高字节
#define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))


/* 
发送给上位机的数据帧定义 
@桢头--功能字--长度--数据(一个或多个,具体看协议说明)-校验
@前2个字节为帧头0xAAAA 
@第3个字节为帧ID,应设置为0xF1~0xFA中的一个 
@第4个字节为报文数据长度(dlc) 
@第5个字节开始到第5+dlc-1个字节为要传输的数据内容段,每个数据场为高字节在前,地字节在后 
@第5+dlc个字节为CheckSum,为第1个字节到第5+dlc-1个字节所有字节的值相加后,保留结果的低八位作为CheckSum 
*/  
void data_to_computer(short* acc_data,short* gyro_data);

void usart1_send_char(u8 c);

#endif
 

#include "anonymity.h"


//串口1发送1个字符 
//c:要发送的字符
void usart1_send_char(u8 c)
{       
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
    USART_SendData(USART1,c);  

/* 
发送给上位机的数据帧定义 
@桢头--功能字--长度--数据(一个或多个,具体看协议说明)-校验
@前2个字节为帧头0xAAAA 
@第3个字节为帧ID,应设置为0xF1~0xFA中的一个 
@第4个字节为报文数据长度(dlc) 
@第5个字节开始到第5+dlc-1个字节为要传输的数据内容段,每个数据场为高字节在前,低字节在后 
@第5+dlc个字节为CheckSum,为第1个字节到第5+dlc-1个字节所有字节的值相加后,保留结果的低八位作为CheckSum 
*/  
void data_to_computer(short* acc_data,short* gyro_data)                //上位机版本:4.34
{
    u8 data_to_send[17] = {0};
    u8 i = 0;
    u8 sum = 0;
    
    data_to_send[0]=0xAA;     //帧头:AAAA
    data_to_send[1]=0xAA;
    data_to_send[2]=0xF1;     //功能字:OXF1
    data_to_send[3]=0x0C;         //需要发送数据的字节数。12个

    data_to_send[4] = BYTE1(acc_data[0]);//取data[0]数据的高字节,
    data_to_send[5] = BYTE0(acc_data[0]);
    data_to_send[6] = BYTE1(acc_data[1]);
    data_to_send[7] = BYTE0(acc_data[1]);
    data_to_send[8] = BYTE1(acc_data[2]);
    data_to_send[9] = BYTE0(acc_data[2]);

    data_to_send[10] = BYTE1(gyro_data[0]);//取data[0]数据的高字节,
    data_to_send[11] = BYTE0(gyro_data[0]);
    data_to_send[12] = BYTE1(gyro_data[1]);
    data_to_send[13] = BYTE0(gyro_data[1]);
    data_to_send[14] = BYTE1(gyro_data[2]);
    data_to_send[15] = BYTE0(gyro_data[2]);

    for(i=0;i<16;i++) //对于for语句,当不写大括号的时候,只执行到下面第一个分号结束。
    {
        sum+=data_to_send[i];
    }
    data_to_send[16] = sum;    //计算校验位
        
        for(i = 0; i < 17; i ++)
        {
        usart1_send_char(data_to_send[i]);  //发送17个u8数据
        }

}
 

有了协议之后,就是上位机的一些设置,我设置如下:

高级收码设置

 

无波形显示注意这里

 

数据容器设置依次类推,注意统一波特率 ,其设置在程序设置中。

没有波形可能是协议有问题,可以对照接收区和自己的数据。

波形显示注意设置成用户数据,按钮在右下,打开串口后点击开始显示,按钮在左下,然后就可以看到波形了。

;