STM32G431RBT6读取jy61p数据

本贴记录STM32G431RBT6读取jy61p数据的代码

一、jy61p介绍

以下内容来自手册:

1.产品概述

2.性能参数

3.引脚说明

4.串口接收数据格式

二.读取数据

1.通过上位机设置jy61p输出参数。

打开自带上位机->配置,我设置的参数如下:

2.写程序

笔者采用STM32TUBEMX+keil5 HAL库的开发方式来实现。

***usart1用于和上位机串口助手通信,usart2和jy61p串口通信。***

主要代码:

(1)定义串口结构体成员有:发送标志位,发送缓存区,接收缓存区。
struct USART
{
	uint8_t Sign;
	char TX[100];
	char RX[100];
};
extern struct USART UART1,UART2;
(2)打开接收中断,空闲中断,usart2从jy61p处获取原始数据
	__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
	__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
	static uint8_t rx_p=0;
	uint8_t temp;
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
	if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE))
	{
		HAL_UART_Receive(&huart2,&temp,1,255);
		UART2.RX[rx_p++]=temp;
		__HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_RXNE);
	}
	if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))
	{
		UART2.RX[rx_p++]='\0';
		rx_p=0;
		UART2.Sign=1;
		__HAL_UART_CLEAR_IDLEFLAG(&huart2);
	}
  /* USER CODE END USART2_IRQn 1 */
}
(3)在jy61p.h和jy61p.c文件里面解算原始数据,获取角速度和姿态角
jy61p.h
#ifndef _jy61p_h
#define _jy61p_h
#include "main.h"
#include <string.h>
#include <stdio.h>
extern double Ax,Ay,Az;
extern double Roll,Pitch,Yaw;

void Gy61p_GetValue(void);

#endif
jy61p.c
#include "jy61p.h"

double Ax,Ay,Az;
double Roll,Pitch,Yaw;

void Gy61p_GetValue(void)
{
	if(UART2.Sign==1)
	{
		UART2.Sign=0;
		if(UART2.RX[0]==0x55&&UART2.RX[1]==0x51&&UART2.RX[11]==0x55&&UART2.RX[12]==0x53)
		{
			Ax=((short)(UART2.RX[3]<<8)|UART2.RX[2])/32768.0*16;
			Ay=((short)(UART2.RX[5]<<8)|UART2.RX[4])/32768.0*16;
			Az=((short)(UART2.RX[7]<<8)|UART2.RX[6])/32768.0*16;
			
			Roll=((short)(UART2.RX[14]<<8)|UART2.RX[13])/32768.0*180;
			Pitch=((short)(UART2.RX[16]<<8)|UART2.RX[15])/32768.0*180;
			Yaw=((short)(UART2.RX[18]<<8)|UART2.RX[17])/32768.0*180;
			
			sprintf(UART1.TX,"Ax:%lf,Ay:%lf,Az:%lf\r\nRoll:%lf,Pitch:%lf,Yaw:%lf\r\n",Ax,Ay,Az,Roll,Pitch,Yaw);
			UART1.Sign=1;
		}
		strcpy(UART2.RX,"");
	}
}
(4)在主程序里面循坏打印
  while (1)
  {
    /* USER CODE END WHILE */
	  
    /* USER CODE BEGIN 3 */
	Gy61p_GetValue();
	if(UART1.Sign==1)
	{
		UART1.Sign=0;
		HAL_UART_Transmit(&huart1,(uint8_t*)UART1.TX,strlen(UART1.TX),255);
	}
  }

三、最终效果

作者:学不懂的李小米

物联沃分享整理
物联沃-IOTWORD物联网 » STM32G431RBT6读取jy61p数据

发表回复