昨天想用匿名上位机测下mpu6050原始数据,找了些资料,但网上也没有很详细讲解的例子,都是直接用的那种
昨天想用匿名上位机测下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*100 |
SUM | 版本信息 | |||||||||
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_Z |
SUM | 飞机传感器数据 | 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 AUX6 |
SUM | 飞机收到的控制数据 | RCDATA | AAAF | 03 | 20 | int16 THR int16 YAW int16 ROL int16 PIT int16 AUX1 int16 AUX2 int16 AUX3 int16 AUX4 int16 AUX5 int16 AUX6 |
SUM | NO | 飞行控制数据(仅用于微型飞机,无刷飞机请用航模遥控控制) | |
GPSDATA | AAAA | 04 | LEN | 参见数据定义->当前位置信息 | SUM | 机载GPS 信息 | AAAF | 04 | LEN | SUM | NO | ||||
POWER | AAAA | 05 | LEN | uint16 Votage*100 uint16 Current*100 |
SUM | 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 MODEL |
AAAA | 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_MODEL |
SUM | 飞行模式 | FLY MODEL |
AAAF | 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_MODEL |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_D |
SUM | 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_2 |
SUM | 单位:cm ANCHOR_ACTIVE: 从最低位到最高位,依次表示1到6号基站是否连接正常 DIST_FL: 左前基站距离 DIST_FR: 右前基站距离 DIST_BL: 左后基站距离 DIST_BR: 右后基站距离 ALT_L_1: 高度1 ALT_L_2: 高度2 |
AAAF | 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_D |
SUM | 单位:cm 距离信息的差分输出 |
AAAF | 31 | LEN | SUM | |||||
Location 位置数据 |
AAAA | 32 | LEN | int16 LOC_X int16 LOC_Y int16 LOC_Z |
SUM | 单位: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_D |
SUM | 单位: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 Set |
AAAA | 3A | LEN | uint8_t MODE uint8_t ANCHOR_CNT uint16_t WIDTH *100 uint16_t LENGTH *100 uint16_t HEIGHT *100 |
SUM | Location Set |
AAAF | 3A | LEN | uint8_t MODE uint8_t ANCHOR_CNT uint16_t WIDTH *100 uint16_t LENGTH *100 uint16_t HEIGHT *100 |
SUM | ||||
Location Set2 |
AAAA | 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_SELECT |
SUM | Location Set2 |
AAAF | 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_SELECT |
SUM | 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 Set |
AAAA | 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_ARC |
SUM | RadioLink Set |
AAAF | 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_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 |
AAAF | 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 ALT |
SUM | NO | 摄像头控制数据 OBJ1用于定位 OBJ2用于计算航向 ALT为高度数据 |
|||||
MSG | AAAA | EE | 7 | uint8_t MSG_ID uint8_t MSG_DATA |
SUM | 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=0xFFFA |
||||
USER_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数据
}
}
有了协议之后,就是上位机的一些设置,我设置如下:
数据容器设置依次类推,注意统一波特率 ,其设置在程序设置中。
没有波形可能是协议有问题,可以对照接收区和自己的数据。
波形显示注意设置成用户数据,按钮在右下,打开串口后点击开始显示,按钮在左下,然后就可以看到波形了。
转自https://blog.csdn.net/a1058191679/article/details/82178869