protocol.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "protocol.h"
  2. CmdData cmd_save;
  3. static protocolComType_t pUartHandle;
  4. __attribute__((weak)) void protocol_callback(CmdData cmd);
  5. __attribute__((weak)) void protocol_data_write(uint8_t data);
  6. static uint8_t CheckSumCal(uint8_t *pData, uint32_t num) {
  7. if (pData == NULL) {
  8. return 0x00;
  9. }
  10. if (num == 0) {
  11. return 0x00;
  12. }
  13. uint8_t crc_data = 0x00;
  14. for (uint32_t i = 0; i < num; i++) {
  15. /*仅保留低位*/
  16. crc_data += 0xff & pData[i];
  17. }
  18. return crc_data;
  19. }
  20. static void InitPtcStruct() {
  21. pUartHandle.step = 0;
  22. pUartHandle.tmpCnt = 0;
  23. pUartHandle.aRxBufIndex = 0;
  24. pUartHandle.aRxCrcIndex = 0;
  25. }
  26. void protocol_rec_put(uint8_t data) {
  27. switch (pUartHandle.step) {
  28. case 0:
  29. if (data == FRAME_HEAD_SAME_FA) { /*帧头正确*/
  30. pUartHandle.step++; /*跳转下一步骤*/
  31. pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = data;
  32. }
  33. break;
  34. case 1:
  35. if (data == FRAME_HEAD_SAME_FA) {
  36. pUartHandle.step =
  37. 1; /*第一帧头重复,回到第二帧头判断处,AA 55 AA 55的情况*/
  38. pUartHandle.aRxBufIndex = 1; /*更新第二帧头*/
  39. } else {
  40. pUartHandle.tmpCnt = data + 1; /*临时计数值*/
  41. pUartHandle.step++; /*跳转下一步骤*/
  42. pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] =
  43. data; /*压入缓冲区*/
  44. if (((RX_BUF_LENGTH - pUartHandle.aRxBufIndex) < data) ||
  45. (data == 0)) { /*缓冲区溢出或数据长度为 0*/
  46. InitPtcStruct(); /*初始化结构体值,准备下一次接收*/
  47. }
  48. }
  49. break;
  50. case 2:
  51. if ((--pUartHandle.tmpCnt) > 0) { /*接收数据到缓冲区*/
  52. pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = data;
  53. if (pUartHandle.aRxBufIndex >=
  54. RX_BUF_LENGTH) { /*长度被意外修改,导致缓冲区溢出*/
  55. InitPtcStruct(); /*初始化结构体值,准备下一次接收*/
  56. }
  57. } else {
  58. if (pUartHandle.aRxBufIndex > 7 &&
  59. CheckSumCal(&pUartHandle.aRxBuf[0],
  60. pUartHandle.aRxBufIndex + 1) == data) {
  61. cmd_save.src = pUartHandle.aRxBuf[2];
  62. cmd_save.dst = pUartHandle.aRxBuf[3];
  63. cmd_save.seq = pUartHandle.aRxBuf[4];
  64. cmd_save.res = pUartHandle.aRxBuf[5];
  65. cmd_save.payload.cmd_id = pUartHandle.aRxBuf[6];
  66. cmd_save.payload.ack_flag = pUartHandle.aRxBuf[7];
  67. cmd_save.payload.cmd_length = pUartHandle.aRxBufIndex - 8;
  68. cmd_save.payload.cmd_value = (uint8_t *)malloc(
  69. sizeof(uint8_t) * cmd_save.payload.cmd_length);
  70. for (int i = 0; i < cmd_save.payload.cmd_length; i++) {
  71. cmd_save.payload.cmd_value[i] =
  72. pUartHandle.aRxBuf[8 + i];
  73. }
  74. protocol_callback(cmd_save);
  75. free(cmd_save.payload.cmd_value);
  76. }
  77. InitPtcStruct(); /*初始化结构体值,准备下一次接收*/
  78. }
  79. break;
  80. default:
  81. InitPtcStruct(); /*初始化结构体值,准备下一次接收*/
  82. break;
  83. }
  84. }
  85. void protocol_send_data(CmdData data) {
  86. protocolComType_t pUartHandle;
  87. pUartHandle.aRxBufIndex = 0;
  88. pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = FRAME_HEAD_SAME_FA;
  89. pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = data.payload.cmd_length + 6;
  90. uint8_t *ptx = (uint8_t *)&data;
  91. for (int i = 0; i < 6; i++) {
  92. pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = ptx[i];
  93. }
  94. if (data.payload.cmd_length) {
  95. ptx = data.payload.cmd_value;
  96. for (int i = 0; i < data.payload.cmd_length; i++) {
  97. pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = ptx[i];
  98. }
  99. }
  100. uint8_t check =
  101. CheckSumCal(&pUartHandle.aRxBuf[0], 8 + data.payload.cmd_length);
  102. pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = check;
  103. for (int i = 0; i < pUartHandle.aRxBufIndex; i++) {
  104. protocol_data_write(pUartHandle.aRxBuf[i]);
  105. }
  106. InitPtcStruct();
  107. }