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){//3float x = 1.123;//7float y = 2.123;//11float z = 3.123;//15float ax = 4.123;//20float ay = 5.123;//24float az = 6.123;//28float gx = 7.123;//32float gy = 8.123;//36float gz = 9.123;//40float v = 10.123;//44float 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));}
