匿名上位机的简单使用(笔记)

 如何在匿名上位机的飞控中使用

本文使用的是欧拉角格式      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。

在库函数里面可以这样来代替

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值