uart6_rt.cuart6_rt.h
解析核心逻辑:
//解析速度数据
void parse_speed(void){
//解析的位数
int i = 0;
//帧头数据是否已经解析
int head = -1;
//任务类型
int type = -1;
//数据长度
int length = -1;
//已经读取的数据长度
int read_length = 0;
//校验位
float check = -1;
while(1){
//走到下一位进行
int8_t data = g6_recv_data[i];
/*------------------ 读取帧头数据 ------------------*/
if(head==-1&&data!=0x7b){
break;
}
if (head==-1&&data == 0x7b) {
printf("recv head\n");
head = 1;
i++;
continue;
}
/*------------------ 读取类型type ------------------*/
if (type == -1) {
//标识
type = data;
printf("recv type type=%d\n", type);
i++;
continue;
}
/*------------------ 读取数据长度 ------------------*/
if (length == -1) {
length = data;
printf("recv length length=%d\n", length);
i++;
continue;
}
/*------------------ 读取数据 ------------------*/
printf("-------------------- length=%d\n", length);
//读取数据
if (read_length < length) {
printf("recv mini data\n");
memcpy(&speed[read_length],&g6_recv_data[i],4);
read_length += 1;
i+=4;
continue;
}
/*------------------ 验证数据结果是否正确 ------------------*/
//校验位
float check = 0.0;
memcpy(&check,&g6_recv_data[i],4);
printf("check:%f\n",check);
float total = 0;
total += type;
total += length;
for (int i = 0; i < length; ++i) {
total += speed[i];
}
printf("total:%f\n", total);
if(check!=total){
break;
}
i+=4;
printf("i=%d\n",i);
int8_t tail = 0;
memcpy(&tail,&g6_recv_data[i],1);
printf("tail:%d\n",tail);
break;
}
}
发送数据逻辑
//需要发送的数据
unsigned char infrared_data[48] = {0x7a,0x01,10};
//发送小车数据
void send_speed(void){
//3
float x = 1.123;
//7
float y = 2.123;
//11
float z = 3.123;
//15
float ax = 4.123;
//20
float ay = 5.123;
//24
float az = 6.123;
//28
float gx = 7.123;
//32
float gy = 8.123;
//36
float gz = 9.123;
//40
float v = 10.123;
//44
float check_sum = 0x01+10+x+y+z+ax+ay+az+gx+gy+gz+v;
//数据准备
memcpy(infrared_data+3,&x,4);
memcpy(infrared_data+7,&y,4);
memcpy(infrared_data+11,&z,4);
memcpy(infrared_data+15,&ax,4);
memcpy(infrared_data+19,&ay,4);
memcpy(infrared_data+23,&az,4);
memcpy(infrared_data+27,&gx,4);
memcpy(infrared_data+31,&gy,4);
memcpy(infrared_data+35,&gz,4);
memcpy(infrared_data+39,&v,4);
memcpy(infrared_data+43,&check_sum,4);
//帧尾
infrared_data[47] = 0x7b;
//infrared_data[48] = '\n';
//printf("%s",infrared_data);
uart6_dma_send(infrared_data,sizeof(infrared_data));
}