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"); //换行+回车
}
|