You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

188 lines
4.4 KiB

2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "atcmd.h"
  2. #include "zport.h"
  3. #define at_processer_rx_buf_size 128
  4. #define at_processer_tx_buf_size 128
  5. // 接收到了多少数据
  6. volatile uint16_t s_at_cmd_uart_rx_off = 0;
  7. // 当前是否正在处理接收到的数据
  8. volatile bool s_at_cmd_uart_rx_buf_is_processing = false;
  9. static uint8_t at_rx_buf[at_processer_rx_buf_size];
  10. //static uint8_t at_tx_buf[at_processer_tx_buf_size];
  11. /* AT指令表 */
  12. const AT_cmd_func at_cmd_func[] = {
  13. {AT_CMD_TEST, "AT", at_cmd_test},
  14. {AT_CMD_IP, "AT+IP=", at_cmd_ip},
  15. {AT_CMD_GW, "AT+GW", NULL},
  16. {AT_CMD_NETMASK, "AT+NETMASK=", NULL},
  17. {AT_CMD_NETMODULE, "AT+NETMODULE=", NULL},
  18. {AT_END, NULL, NULL}};
  19. unsigned int mstrlen(const char *s)
  20. {
  21. const char *ss = s;
  22. while (*ss)
  23. ss++;
  24. return ss - s;
  25. }
  26. int mstrncmp(const char *s1, const char *s2, int n)
  27. {
  28. const unsigned char *c1 = (const unsigned char *)s1;
  29. const unsigned char *c2 = (const unsigned char *)s2;
  30. unsigned char ch;
  31. int d = 0;
  32. while (n--)
  33. {
  34. d = (int)(ch = *c1++) - (int)*c2++;
  35. if (d || !ch)
  36. break;
  37. }
  38. return d;
  39. }
  40. /* 指令执行函数 */
  41. unsigned char at_cmd_test(unsigned char *p, unsigned char len)
  42. {
  43. printf("AT+OK\r\n");
  44. return 0;
  45. }
  46. unsigned char at_cmd_ip(unsigned char *p, unsigned char len)
  47. {
  48. if (*p == '?')
  49. {
  50. printf("AT+OK BLE-NAME\r\n");
  51. }
  52. else
  53. {
  54. printf("AT+OK\r\n");
  55. }
  56. return 0;
  57. }
  58. /* 查找指令表中对应的指令 */
  59. unsigned char AT_cmd_search(unsigned char *p, unsigned char len)
  60. {
  61. unsigned char ret = 0;
  62. // unsigned char *pstr;
  63. unsigned char i, n;
  64. for (i = 1; at_cmd_func[i].cmd != AT_END; i++)
  65. {
  66. n = mstrlen((const char *)at_cmd_func[i].str);
  67. if (!mstrncmp((const char *)p, (const char *)at_cmd_func[i].str, n))
  68. {
  69. ret = i;
  70. break;
  71. }
  72. }
  73. return ret;
  74. }
  75. /* AT指令解析 */
  76. unsigned char at_cmd_parse(unsigned char *p, unsigned char len)
  77. {
  78. unsigned char ret = AT_SUCCESS;
  79. unsigned char index = 0;
  80. if (len < 4)
  81. return AT_ERR; /* 不符合指令最小长度 */
  82. if ((p[0] == 'A') && (p[1] == 'T') && (p[len - 2] == 0x0D) && (p[len - 1] == 0x0A))
  83. {
  84. if (len == 4)
  85. { /* 测试指令 */
  86. if (at_cmd_func[AT_CMD_TEST].cb != NULL)
  87. at_cmd_func[AT_CMD_TEST].cb(NULL, 0); /* 执行测试指令 */
  88. }
  89. else if (p[2] == '+')
  90. { /* 执行指令解析 */
  91. index = AT_cmd_search(p, len); /* 查找匹配的执行指令,0-已匹配,!0-未匹配 */
  92. if (index)
  93. {
  94. if (at_cmd_func[index].cb != NULL)
  95. { /* 判断指令对应执行函数是否存在 */
  96. unsigned char n;
  97. n = mstrlen((const char *)at_cmd_func[index].str);
  98. ret = at_cmd_func[index].cb(p + n, len - n); /* 执行对应的指令函数, p+n:将指令参数传输执行函数,len-n-2:指令参数有效长度 */
  99. }
  100. else
  101. ret = AT_ERR_FUN_UNUSED; /* 没有可执行函数 */
  102. }
  103. else
  104. {
  105. ret = AT_ERR_UNINVAIL; /* 未找到匹配的指令 */
  106. }
  107. }
  108. }
  109. else
  110. { /* 格式不匹配 */
  111. return AT_ERR;
  112. }
  113. return ret;
  114. }
  115. void at_cmd_processer_push_data(uint8_t rxdata)
  116. {
  117. if (!s_at_cmd_uart_rx_buf_is_processing)
  118. {
  119. if (s_at_cmd_uart_rx_off < at_processer_rx_buf_size)
  120. {
  121. at_rx_buf[s_at_cmd_uart_rx_off] = rxdata;
  122. s_at_cmd_uart_rx_off++;
  123. }
  124. }
  125. }
  126. void at_cmd_processer_try_process_data(void)
  127. {
  128. /**
  129. * @brief
  130. * modbus协议3.5
  131. */
  132. if (s_at_cmd_uart_rx_off != 0)
  133. {
  134. uint16_t modbus_uart_rx_off_before = s_at_cmd_uart_rx_off;
  135. HAL_Delay(1);
  136. sys_critical_enter();
  137. if (s_at_cmd_uart_rx_off == modbus_uart_rx_off_before)
  138. {
  139. s_at_cmd_uart_rx_buf_is_processing = true;
  140. }
  141. sys_critical_exit();
  142. if (s_at_cmd_uart_rx_buf_is_processing)
  143. {
  144. at_cmd_parse(at_rx_buf, s_at_cmd_uart_rx_off);
  145. sys_critical_enter();
  146. s_at_cmd_uart_rx_off = 0;
  147. s_at_cmd_uart_rx_buf_is_processing = false;
  148. sys_critical_exit();
  149. }
  150. }
  151. }