uart6_rt.cuart6_rt.h
    解析核心逻辑:

    1. //解析速度数据
    2. void parse_speed(void){
    3. //解析的位数
    4. int i = 0;
    5. //帧头数据是否已经解析
    6. int head = -1;
    7. //任务类型
    8. int type = -1;
    9. //数据长度
    10. int length = -1;
    11. //已经读取的数据长度
    12. int read_length = 0;
    13. //校验位
    14. float check = -1;
    15. while(1){
    16. //走到下一位进行
    17. int8_t data = g6_recv_data[i];
    18. /*------------------ 读取帧头数据 ------------------*/
    19. if(head==-1&&data!=0x7b){
    20. break;
    21. }
    22. if (head==-1&&data == 0x7b) {
    23. printf("recv head\n");
    24. head = 1;
    25. i++;
    26. continue;
    27. }
    28. /*------------------ 读取类型type ------------------*/
    29. if (type == -1) {
    30. //标识
    31. type = data;
    32. printf("recv type type=%d\n", type);
    33. i++;
    34. continue;
    35. }
    36. /*------------------ 读取数据长度 ------------------*/
    37. if (length == -1) {
    38. length = data;
    39. printf("recv length length=%d\n", length);
    40. i++;
    41. continue;
    42. }
    43. /*------------------ 读取数据 ------------------*/
    44. printf("-------------------- length=%d\n", length);
    45. //读取数据
    46. if (read_length < length) {
    47. printf("recv mini data\n");
    48. memcpy(&speed[read_length],&g6_recv_data[i],4);
    49. read_length += 1;
    50. i+=4;
    51. continue;
    52. }
    53. /*------------------ 验证数据结果是否正确 ------------------*/
    54. //校验位
    55. float check = 0.0;
    56. memcpy(&check,&g6_recv_data[i],4);
    57. printf("check:%f\n",check);
    58. float total = 0;
    59. total += type;
    60. total += length;
    61. for (int i = 0; i < length; ++i) {
    62. total += speed[i];
    63. }
    64. printf("total:%f\n", total);
    65. if(check!=total){
    66. break;
    67. }
    68. i+=4;
    69. printf("i=%d\n",i);
    70. int8_t tail = 0;
    71. memcpy(&tail,&g6_recv_data[i],1);
    72. printf("tail:%d\n",tail);
    73. break;
    74. }
    75. }

    发送数据逻辑

    1. //需要发送的数据
    2. unsigned char infrared_data[48] = {0x7a,0x01,10};
    3. //发送小车数据
    4. void send_speed(void){
    5. //3
    6. float x = 1.123;
    7. //7
    8. float y = 2.123;
    9. //11
    10. float z = 3.123;
    11. //15
    12. float ax = 4.123;
    13. //20
    14. float ay = 5.123;
    15. //24
    16. float az = 6.123;
    17. //28
    18. float gx = 7.123;
    19. //32
    20. float gy = 8.123;
    21. //36
    22. float gz = 9.123;
    23. //40
    24. float v = 10.123;
    25. //44
    26. float check_sum = 0x01+10+x+y+z+ax+ay+az+gx+gy+gz+v;
    27. //数据准备
    28. memcpy(infrared_data+3,&x,4);
    29. memcpy(infrared_data+7,&y,4);
    30. memcpy(infrared_data+11,&z,4);
    31. memcpy(infrared_data+15,&ax,4);
    32. memcpy(infrared_data+19,&ay,4);
    33. memcpy(infrared_data+23,&az,4);
    34. memcpy(infrared_data+27,&gx,4);
    35. memcpy(infrared_data+31,&gy,4);
    36. memcpy(infrared_data+35,&gz,4);
    37. memcpy(infrared_data+39,&v,4);
    38. memcpy(infrared_data+43,&check_sum,4);
    39. //帧尾
    40. infrared_data[47] = 0x7b;
    41. //infrared_data[48] = '\n';
    42. //printf("%s",infrared_data);
    43. uart6_dma_send(infrared_data,sizeof(infrared_data));
    44. }