如何在匿名上位机的飞控中使用
本文使用的是欧拉角格式 ID: 0x03: 飞控姿态:欧拉角格式
直接将下面代码分别建立一个.c和.h文件,将相关代码复制进去
Ni_min.h文件
#ifndef __Ni_min__
#define __Ni_min__
#include "main.h"
#include "usart.h"
#include "gpio.h"
void sent_data(s16 a,s16 b,s16 c,s8 fu);
#endif /* __I2C_H__ */
Ni_min.c文件程序
#include "Ni_min.h"
#define BYTE0(dwtemp) (*(char *)(&dwtemp))//取出int型变量的低字节
#define BYTE1(dwtemp) (*((char *)(&dwtemp) +1 ))// 取存储在此变量下一内存字节的内容,高字节
#define BYTE2(dwtemp) (*((char *)(&dwtemp) +2 ))
#define BYTE3(dwtemp) (*((char *)(&dwtemp) +3 ))
u8 BUFF[100]; //定义的数组
/*该函数是一个简单的匿名上位机的基本通信协议的解码,该函数中的s16 a,s16 b,s16 c表示的就是需要*传输的数据,本函数使用的是匿名科技提供的通信协议的ID:0X03:飞控姿态:欧拉角格式。*/
void sent_data(s16 a,s16 b,s16 c,s8 fu)
{
int i;
u8 sumcheck = 0;
u8 addcheck = 0;
u8 cnt=0;
BUFF[cnt++]=0xAA;//帧头
BUFF[cnt++]=0xFF;//目标地址
BUFF[cnt++]=0X03;//功能码
BUFF[cnt++]=0x07;//数据长度
BUFF[cnt++]=BYTE0(a);//数据内容,小段模式,低位在前
BUFF[cnt++]=BYTE1(a);//需要将字节进行拆分,调用上面的宏定义即可。
BUFF[cnt++]=BYTE0(b);
BUFF[cnt++]=BYTE1(b);
BUFF[cnt++]=BYTE0(c);
BUFF[cnt++]=BYTE1(c);
BUFF[cnt++]=fu; //姿态融合状态
/*SC和AC的校验直接抄最上面上面简介的即可,在简介中校验方式写的很详细,从帧头开始,
对每一字节进行求和,直到DATA区结束,所以在下面就是一个循环,直接到cnt这个位置就好了*/
for(i=0;i<cnt;i++)
{
sumcheck+=BUFF[i];
addcheck+=sumcheck;
}
BUFF[cnt++]=sumcheck;
BUFF[cnt++]=addcheck;
/*把数据放入到串口1,发送出去上,用的是hal库中的函数,后面会说明标准库如如何写该函数*/
HAL_UART_Transmit(&huart1, BUFF, cnt, 0xffff);
}
usart.c中的改动
usart.h中添加申明
main.c文件程序
用cubemax把串口配置好,在usart.c文件中把串口初始化函数改一下,把波特率的值放在传参处,别忘了在usart,h中要申明该函数。
上位机的操作
选对好端口号,波特率设置为500k,再在右下角打开连接
点击红框里面的就可以到数据传输界面了
详细说明:
把一个int类型转换成字节
在这里用#define来定义了一系列的操作,就是把一个int类型的数变换成字节的格式,比如一个int8_t 类型的数据就是一个字节,int16_t就是两个字节,这样就可以把一个不同int类型数据转换从字节,这是一个常规方法
#define BYTE0(dwtemp) (*(char *)(&dwtemp))//取出int型变量的低字节
#define BYTE1(dwtemp) (*((char *)(&dwtemp) +1 ))//取存储在此变量下一内存字节的内容,高字节
#define BYTE2(dwtemp) (*((char *)(&dwtemp) +2 ))
#define BYTE3(dwtemp) (*((char *)(&dwtemp) +3 ))
关于 void sent_data() 函数
void sent_data(s16 a,s16 b,s16 c,s8 fu)。
该函数是一个简单的匿名上位机的基本通信协议的解码,该函数中的s16 a,s16 b,s16 c表示的就是一个需要传输的数据,总共6个字节,都一起放在这个通信数组中,这个数组是按照通信协议所写的,s8 fu是姿态融合状态参数,占一个字节,本程序使用的是匿名科技提供的通信协议的ID:0X03:飞控姿态:欧拉角格式。
匿名上位机的通信帧格式介绍
这是校验位的方式以及示例
在这个函数中呢,我们使用的是欧拉角格式,如果你想使用四元数格式,就需要在添加一个数据,此时
void sent_data(s16 a,s16 b,s16 c,s8 fu)。
这个函数名字就要写成
void sent_data(s16 a,s16 b,s16 c,s16 d,s8 fu)
因为在下面第二章图中,他的DATA区域的数据内容有四个数,V0,V1,V2,V3,还有一个融合状态,并且在程序中,我们的ID功能码和数据长度位的字节也要改写成
BUFF[cnt++]=0xAA;//帧头
BUFF[cnt++]=0xFF;//目标地址
BUFF[cnt++]=0X04;//功能码
BUFF[cnt++]=0x09;//数据长度
HAL_UART_Transmit()
HAL_UART_Transmit(&huart1, BUFF, cnt, 0xffff);
这个函数的功能可以在hul库中查看到,第一个参数是UARE外设的句柄,指定要使用的UART外设,第二个是要发送数据,也可以是说是要发送的数据缓冲区的指针,第三个是要发送数据的大小,第四个是发送时间,单位为ms。
在库函数里面可以这样来代替