protocol.cpp 3.6 KB

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