昨天想用匿名上位机测下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.飞控->上位机 上位机(遥控)->飞控 帧 帧头 功能字 长度 数据 校验 备注 帧 帧头 功能字 长度 数据 校验 返回校验 备注 VER AAAA 00 LEN uint8 HardwareType硬件种类
uint16 HardwareVER*100硬件版本
uint16 SoftwareVER*100软件版本
uint16 ProtocolVER*100协议版本
uint16 BootloaderVER*100SUM 版本信息 STATUS AAAA 01 LEN int16 ROL*100
int16 PIT*100
int16 YAW*100
int32 ALT_USE(高度cm)
uint8 FLY_MODEL(飞行模式)
u8 ARMED : 0加锁 1解锁SUM 飞机姿态等基本信息 CONMAND AAAF 01 1 uint8 CMD1 SUM YES 命令集合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:飞控解锁(仅用于手机蓝牙控制)SENSER AAAA 02 18 int16 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_ZSUM 飞机传感器数据 ACK AAAF 02 1 uint8 CMD2 SUM YES 命令集合2
01:读取PID请求(返回AAAA 10\11\12\13\14\15数据帧)
02:读取飞行模式设置请求(返回AAAA 0A数据帧)
21:读取飞控内航点数量(返回AAAA 20数据帧)
30:读取无线定位模块设置
40:读取数传模块设置
A0:读取下位机版本信息(返回AAAA 00数据帧)
A1:恢复默认参数RCDATA AAAA 03 20 int16 THR
int16 YAW
int16 ROL
int16 PIT
int16 AUX1
int16 AUX2
int16 AUX3
int16 AUX4
int16 AUX5
int16 AUX6SUM 飞机收到的控制数据 RCDATA AAAF 03 20 int16 THR
int16 YAW
int16 ROL
int16 PIT
int16 AUX1
int16 AUX2
int16 AUX3
int16 AUX4
int16 AUX5
int16 AUX6SUM NO 飞行控制数据(仅用于微型飞机,无刷飞机请用航模遥控控制) GPSDATA AAAA 04 LEN 参见数据定义->当前位置信息 SUM 机载GPS 信息 AAAF 04 LEN SUM NO POWER AAAA 05 LEN uint16 Votage*100
uint16 Current*100SUM AAAF 05 LEN SUM NO MOTO 06 LEN uint16 PWM_MOTO12345678 SUM 马达PWM(范围0-
1000)AAAF 06 LEN SUM NO SENSER2 AAAA 07 LEN int32 ALT_BAR(推荐为cm单位)
uint16 ALT_CSB(超声波高度cm)SUM AAAF 07 LEN SUM NO AAAA 08 LEN SUM AAAF 08 LEN SUM NO AAAA 09 LEN SUM AAAF 09 LEN SUM NO FLY
MODELAAAA 0A LEN int8 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_MODELSUM 飞行模式 FLY
MODELAAAF 0A LEN int8 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_MODELSUM YES 飞行模式 AAAA 0B LEN int16 SPEED_ROL
int16 SPEED_PIT
int16 SPEED_Z(单位cm)SUM AAAF 0B LEN SUM AAAA 0C LEN SUM AAAF 0C LEN SUM AAAA 0D LEN SUM AAAF 0D LEN SUM AAAA 0E LEN SUM AAAF 0E LEN SUM AAAA 0F LEN SUM AAAF 0F LEN SUM PID1 AAAA 10 18 int16 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_DSUM PID数据帧1 PID1 AAAF 10 18 int16 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_DSUM YES PID数据帧1到6
共有18组PID,每3组PID组成一个PID数据帧,所以共6个PID数据帧PID2 AAAA 11 18 int16 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_DSUM PID数据帧2 PID2 AAAF 11 18 int16 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_DSUM YES PID3 AAAA 12 18 int16 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_DSUM PID数据帧3 PID3 AAAF 12 18 int16 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_DSUM YES PID4 AAAA 13 18 int16 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_DSUM PID数据帧4 PID4 AAAF 13 18 int16 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_DSUM YES PID5 AAAA 14 18 int16 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_DSUM PID数据帧5 PID5 AAAF 14 18 int16 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_DSUM YES PID6 AAAA 15 18 int16 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_DSUM PID数据帧6 PID6 AAAF 15 18 int16 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_DSUM YES AAAA 16 LEN SUM AAAF 16 LEN SUM AAAA 17 LEN SUM AAAF 17 LEN SUM AAAA LEN SUM AAAF LEN SUM AAAA LEN SUM AAAF LEN SUM FP_NUM AAAA 20 LEN uing16 FP_NUM SUM 飞控已有航点数量 READ_FP AAAF 20 LEN uint16 FP_CNT SUM 读取第CNT个航点信息 FP AAAA 21 LEN 参见数据定义->航点信息 SUM 航点信息 FP AAAF 21 LEN 参见数据定义->航点信息 SUM YES 写入航点信息 AAAA LEN SUM AAAF LEN SUM AAAA LEN SUM AAAF LEN SUM Distances
测距数据AAAA 30 LEN uint8 ANCHOR_ACTIVE
uint16 DIST_FL
uint16 DIST_FR
uint16 DIST_BL
uint16 DIST_BR
uint16 ALT_L_1
uint16 ALT_L_2SUM 单位:cm
ANCHOR_ACTIVE:
从最低位到最高位,依次表示1到6号基站是否连接正常
DIST_FL:
左前基站距离
DIST_FR:
右前基站距离
DIST_BL:
左后基站距离
DIST_BR:
右后基站距离
ALT_L_1:
高度1
ALT_L_2:
高度2AAAF 30 LEN SUM D_Distances
测距差分AAAA 31 LEN uint8 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_DSUM 单位:cm
距离信息的差分输出AAAF 31 LEN SUM Location
位置数据AAAA 32 LEN int16 LOC_X
int16 LOC_Y
int16 LOC_ZSUM 单位:cm
LOC_X/Y/Z:
解算出的位置信息AAAF 32 LEN SUM D_Location
位置差分AAAA 33 LEN int16 LOC_X_D
int16 LOC_Y_D
int16 LOC_Z_DSUM 单位:cm
位置信息差分输出AAAF 33 LEN SUM AAAA 34 LEN SUM AAAF 34 LEN SUM AAAA 35 LEN SUM AAAF 35 LEN SUM AAAA 36 LEN SUM AAAF 36 LEN SUM AAAA 37 LEN SUM AAAF 37 LEN SUM AAAA 38 LEN SUM AAAF 38 LEN SUM AAAA 39 LEN SUM AAAF 39 LEN SUM Location
SetAAAA 3A LEN uint8_t MODE
uint8_t ANCHOR_CNT
uint16_t WIDTH *100
uint16_t LENGTH *100
uint16_t HEIGHT *100SUM Location
SetAAAF 3A LEN uint8_t MODE
uint8_t ANCHOR_CNT
uint16_t WIDTH *100
uint16_t LENGTH *100
uint16_t HEIGHT *100SUM Location
Set2AAAA 3B LEN uint8_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_SELECTSUM Location
Set2AAAF 3B LEN uint8_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_SELECTSUM ANCHOR_ENABLE:
从最低位到最高位,依次表示1到6号基站是否启用
OUT_SELECT:
bit0:距离信息输出
bit1:距离差分输出
bit2:位置信息输出
bit3:位置差分输出AAAA 3C LEN SUM AAAF 3C LEN SUM AAAA LEN SUM AAAF LEN SUM RadioLink
SetAAAA 40 LEN u8 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_ARCSUM RadioLink
SetAAAF 40 LEN u8 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_ARCSUM 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
CONTROLAAAF 80 13 uint8 OBJ1_OK =1可用=0不可用
uint16 OBJ1_X
uint16 OBJ1_Y
uint8 OBJ2_OK
uint16 OBJ2_X
uint16 OBJ2_Y
uint8 ALT_OK
uint16 ALTSUM NO 摄像头控制数据
OBJ1用于定位
OBJ2用于计算航向
ALT为高度数据MSG AAAA EE 7 uint8_t MSG_ID
uint8_t MSG_DATASUM MSG_ID:
01:加速度
02:陀螺仪
03:罗盘
30:无线定位模块
40:匿名数传
MSG_DATA:
01:校准成功
E1:校准失败
31:设置成功
32:设置成功2
A1:恢复默认成功AAAF LEN SUM CHECK AAAA EF 7 uint8 FREAM_HEAD 帧头
uint8 CHECK_SUM 和校验SUM 比如要返回PID1数据帧的校验数据,FREAM_HEAD=0x10,CHECK_SUM=接收到PID1数据帧计算出的SUM AAAF LEN SUM AAAA F0 LEN SUM IAP AAAF F0 LEN uint16 BOOT_STA SUM NO 立即进入IAP功能:
BOOT_STA=0xFFFAUSER_DATA AAAA F1 LEN 自定义 SUM 用户数据 AAAF LEN SUM USER_DATA AAAA F2 LEN 自定义 SUM 用户数据 USER_DATA AAAA F3 LEN 自定义 SUM 用户数据 USER_DATA AAAA F4 LEN 自定义 SUM 用户数据 USER_DATA AAAA F5 LEN 自定义 SUM 用户数据 USER_DATA AAAA F6 LEN 自定义 SUM 用户数据 USER_DATA AAAA F7 LEN 自定义 SUM 用户数据 USER_DATA AAAA F8 LEN 自定义 SUM 用户数据 USER_DATA AAAA F9 LEN 自定义 SUM 用户数据 USER_DATA AAAA FA LEN 自定义 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数据
}}
有了协议之后,就是上位机的一些设置,我设置如下:
数据容器设置依次类推,注意统一波特率 ,其设置在程序设置中。
没有波形可能是协议有问题,可以对照接收区和自己的数据。
波形显示注意设置成用户数据,按钮在右下,打开串口后点击开始显示,按钮在左下,然后就可以看到波形了。