联动了多个模组,尝试了多种数据接收格式,包括32与arduino、蓝牙模块的通信,遇到了各种坑,不过终究是解决了。
有点累,先记一下代码。
主函数:
/**
******************************************************************************
* @author YCHEN
* @version V1.3
* @date 2021-10-23
* @brief 备战电赛
******************************************************************************
*
* 型号 :STM32F103VET6
* 博客 :https://blog.csdn.net/YANGCHEN144?spm=1000.2115.3001.5343
* 参考资料 :野火教程
* 程序功能 :
1.LED灯
2.配置了USART1,USART2,USART3,其中1用来与JY61通信,2用来监视串口
3.200ms的定时
4.两个按键中断
******************************************************************************
*/
#include "stm32f10x.h"
#include "bsp_led.h"
#include "./usart/bsp_usart.h"
#include <string.h>
#include <stdio.h>
#include "./JY61/JY61.h"
#include "./TimBase/bsp_TiMbase.h"
#include "./EXTI/bsp_exti.h"
#define SOFT_DELAY Delay(0x00FFFF);
void Delay(__IO u32 nCount);
struct SAcc stcAcc;
struct SGyro stcGyro;
struct SAngle stcAngle;
//用串口1给JY模块发送指令
void sendcmd(char cmd[])
{
char i;
for(i=0;i<3;i++)
UART1_Put_Char(cmd[i]);
}
void sendcmd5(char cmd[])
{
char i;
for(i=0;i<10;i++)
UART1_Put_Char(cmd[i]);
}
//CopeSerialData为串口2中断调用函数,串口每收到一个数据,调用一次这个函数。
void CopeSerial2Data(unsigned char ucData)
{
static unsigned char ucRxBuffer[250];
static unsigned char ucRxCnt = 0;
//Usart_SendByte( DEBUG_USARTx2, ucData);
//printf("欢迎使用\n\n");
ucRxBuffer[ucRxCnt++]=ucData; //将收到的数据存入缓冲区中
if (ucRxBuffer[0]!=0x55) //数据头不对,则重新开始寻找0x55数据头
{
ucRxCnt=0;
return;
}
if (ucRxCnt<11) {return;}//数据不满11个,则返回
else
{
switch(ucRxBuffer[1])//判断数据是哪种数据,然后将其拷贝到对应的结构体中,有些数据包需要通过上位机打开对应的输出后,才能接收到这个数据包的数据
{
//memcpy为编译器自带的内存拷贝函数,需引用"string.h",将接收缓冲区的字符拷贝到数据结构体里面,从而实现数据的解析。
case 0x51: memcpy(&stcAcc,&ucRxBuffer[2],8);break;
case 0x52: memcpy(&stcGyro,&ucRxBuffer[2],8);break;
case 0x53: memcpy(&stcAngle,&ucRxBuffer[2],8);break;
}
ucRxCnt=0;//清空缓存区
}
}
int main(void)
{
unsigned char i = 0;
unsigned int j = 0;
float X=0.0,Y=0.0,Z=0.0;
//--------------------------------------------------------------------------------
/* 初始化 */
//--------------------------------------------------------------------------------
LED_GPIO_Config();
USART_Config1();
USART_Config2();
BASIC_TIM_Init();
EXTI_Key_Config();
//--------------------------------------------------------------------------------
/*setup*/
//--------------------------------------------------------------------------------
//LED1_ON;
printf("YCHEN\n");
printf("正在进行加速度校准\r\n");
sendcmd(ACCCMD);//等待模块内部自动校准好,模块内部会自动计算需要一定的时间
printf("加速度校准完成\r\n");
SOFT_DELAY;
printf("进行Z轴角度清零\r\n");
sendcmd(YAWCMD);
printf("Z轴角度清零完成\r\n");
//---------------------------------------------------------------------------------
while(1)
{
for(j=0;j<5;j++){SOFT_DELAY;}//延时
/*下面这一块不推荐使用*/
// i++;
// if(i>10)
// {
// i = 0;
// printf("正在进行加速度校准\r\n");
// sendcmd(ACCCMD);//等待模块内部自动校准好,模块内部会自动计算需要一定的时间
// printf("加速度校准完成\r\n");
// SOFT_DELAY;
// printf("进行Z轴角度清零\r\n");
// sendcmd(YAWCMD);
// printf("Z轴角度清零完成\r\n");
// }
printf("-----------------------------------\r\n");
//输出加速度
//串口接受到的数据已经拷贝到对应的结构体的变量中了,根据说明书的协议,以加速度为例 stcAcc.a[0]/32768*16就是X轴的加速度,
//printf("Acc:%.3f %.3f %.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);
//SOFT_DELAY;
//输出角速度
//printf(