通过无线串口ATK-LoRa-01发送陀螺仪MPU6050三种维度信息---数值处理代码分享(小成就^V^)

1.主机

        将3个数值(有符号整形int)转化为12个字符串(方便接收方处理数据),每四位为一个数值,其中每四位的第一位是符号位,正值时为'0'号,负值时为'-'号,转化为字符串通过无线串口发送。

        具体的是现将12位字符串存入二维数组(A[3][4])中,然后逐个遍历发送。

/**
  * @brief  MPU6050数据上报
  * @param  无
  * @retval 无
  */
void DATA_Report(void)
{
	static u8 i,j;
	if(mpu6050.flag == 1)						//采集成功时
	{ 	
		for(i=0;i<3;i++)              //对发送数据(三种不同方向的角度)进行处理,以12位的字符串发送过去
		{
			if(i==0)temp=pitch;							 //赋temp为pitch
			if(i==1)temp=roll;               //赋temp为roll
			if(i==2)temp=yaw;                //赋temp为yaw
			for(j=0;j<4;j++)
			{
				if(temp<0)                     //判断所赋值的正负,以便于给字符串中间添加'-'号
				{
					temp=-temp;                  //取反方便求余
					switch(j)
					{
						case 0:A[i][0]='-';break;  //给每一个数值转化为字符串的第一位加一个'-'的字符
						case 1:A[i][1]=temp%1000/100;break;  //每一个数值的百位转换为字符
						case 2:A[i][2]=temp%100/10;break;    //每一个数值的十位转换为字符 
						case 3:A[i][3]=temp%10;break;        //每一个数值的个位转换为字符
						default:break;
					}
				}
				else                           //如果为正值直接转换
				{
					switch(j)
					{
						case 0:A[i][0]=temp%10000/1000;break;//每一个数值的千位转换为字符
						case 1:A[i][1]=temp%1000/100;break;  //每一个数值的百位转换为字符
						case 2:A[i][2]=temp%100/10;break;    //每一个数值的十位转换为字符
						case 3:A[i][3]=temp%10;break;        //每一个数值的个位转换为字符
						default:break;
					}
				}
			}
		}
		
		for(i=0;i<3;i++)                             //通过遍历二维数组将12个字符串通过无线串口发送过去
		{
			for(j=0;j<4;j++)
			{
				if(A[i][j]=='-')                         //判断如果是'-'号,单独发送,因为不能通过%d发送
				{
					u3_printf("-");
				}
				else
				{
					u3_printf("%d",A[i][j]);               //若不是'-'号,直接通过%d发送	  
					                                       ///**注意**/:char类型既可以表示字符,又可以同时表示整形数字,所以可以通过%d直接打印发送
				}
			}
		}
//		u3_printf("\r\n");
		
//		printf("gyrox:%d,gyroy:%d,gyroz:%d,aacx:%d,aacy:%d,aacz:%d\r\n",gyrox,gyroy,gyroz,aacx,aacy,aacz);//上报角速度数据,角加速度数据
		LED1=!LED1;								 			//LED闪烁
		mpu6050.flag = 0;									//采集成功标志位设置为无效
	}
	else ;														//防卡死
}

 2.从机数据处理

(1)对LoRa.c的处理

        现将从发送方得到的数据(12位字符串)存储在一维数组A[]中,方便后续数据处理。

//Lora模块接收数据
void LoRa_ReceData(void)
{
		u16 i=0;
		u16 len=0;
  if(USART3_RX_STA&0x8000)
	{
		len = USART3_RX_STA&0X7FFF;
		USART3_RX_BUF[len]=0;//添加结束符
		USART3_RX_STA=0;

		for(i=0;i<len;i++)
		{
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
			A[i]=USART3_RX_BUF[i];                     //将接收到的字符串一个一个的存入一维数组A[]中
//			USART_SendData(USART1,USART3_RX_BUF[i]); //通过串口3接收到的数据发送至串口1,USART3_RX_BUF[i]为数据
		}
  }
}

(2)接收方数据处理函数

        将12位串在转换为3位有符号整形的数字,存储在数组B[]中,方便对数值做出判断。

        补充:C语言中strlen(A)是求数组A到\0(结束符)的字符长度,不包括\0.

/*************************
*数据处理
*将接收到的12个字符串(带'-'号的)转化为三个数字
*B[3]:用来存储三个数值
*A[]:用来存储12个字符
**************************/
void Data(void) 
{
	static u8 i,j;
	for(i=0;i<strlen(A);i++)
		{
			if(i>=0&&i<4)           //判断前4个字符为一个数字
			{
				j=i;                  //做一个10000整除时的标志位
				if(i==0&&A[i]=='-')   //判断第0位的字符数是否为'-'号
				{
					E=-1;               //若为'-'则设置一个标志位E
				}
				else                  //若第一位不为'-',说明该4位组成的一个数字为正数
				{
					B[0]=B[0]+(A[i]-48)*(10000/(pow(10,j+1)));//将每一位乘以对应的10的几次方相加起来得到该数值
				}
			}
			
			if(i>=4&&i<8)           //判断中间4个字符为一个数字
			{
				j=i-4;
				if(i==4&&A[i]=='-')
				{
					F=-1;
				}
				else
				{
					B[1]=B[1]+(A[i]-48)*(10000/(pow(10,j+1)));
				}
			}
			
			if(i>=8&&i<12)          //判断最后4个字符为一个数字
			{
				j=i-8;
				if(i==8&&A[i]=='-')
				{
					G=-1;
				}
				else
				{
					B[2]=B[2]+(A[i]-48)*(10000/(pow(10,j+1)));
				}
			}
		}
		/*对正负做判断如果为负在原有的基础上乘-1*/
		if(E==-1)          //判断第一个值的正负
		{
			B[0]=B[0]*(-1);  //在原有的基础上乘-1转换为负值
			E=0;             //对标志位清零
		}
		if(F==-1)          //判断第二个值的正负
		{
			B[1]=B[1]*(-1);
			F=0;             //对标志为清零
		}
		if(G==-1)          //判断第三个值的正负
		{
			B[2]=B[2]*(-1);
			G=0;             //对标志为清零
		}
		
		for(i=0;i<3;i++)   //将这三个数值打印出来
		{
			printf("%d  ",B[i]);
			B[i]=0;          //对数组清零,方便下一次赋值
		}
		printf("\r\n");    //换行+回车
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不惑梦蝶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值