通过无线串口ATK-LoRa-01发送陀螺仪MPU6050三种维度信息---数值处理代码分享(小成就^V^)
2024-05-09 05:09:53
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为pitchif(i==1)temp=roll; //赋temp为rollif(i==2)temp=yaw; //赋temp为yawfor(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"); //换行+回车
}
最新文章
- java plc通讯_树莓派+西门子PLC+Aliyun
- 开发中经常碰到的问题cookie和session问题,今天一并解决
- 哒螨灵使用注意事项_杀螨最优组合,老的、少的、没出生的,都管用
- IE、FF的基本注意事项
- 邮件发送---在.net2003和2005中
- gcc编译c文件 python.h 未找到
- 学习《html5.css3.0》网页布局和样式精粹(第一天)
- tensorflow-object-detection
- I00020 计算卡特兰数函数
- 数据库实验2:数据库的建立与维护
- Java 核心系列教程
- 既然有http 请求,为什么还要用rpc调用?
- IntelliJ IDEA2017.3 破解
- 子网划分,掩码转换计算
- gtx 750 linux驱动下载,Ubuntu 12.04安装NVIDIA GTX750显卡驱动
- 2013中国企业500强榜单出炉
- python抢mac微信红包群_要抢红包?Python来帮你~
- 4G时代 运营商的经营模式变化
- 图形渲染与UWA论坛,mipi官网
- Dmoz对Google的PageRank影响(转)