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.

138 lines
3.2 KiB

2 years ago
  1. #include "atcmd.h"
  2. /* AT指令表 */
  3. const AT_cmd_func at_cmd_func[] = {
  4. {AT_CMD_TEST, "AT", at_cmd_test},
  5. {AT_CMD_NAME, "AT+NAME=", at_cmd_name},
  6. {AT_CMD_DISA, "AT+DISC", NULL},
  7. {AT_CMD_TX_POWER, "AT+TX=", NULL},
  8. {AT_CMD_ADV_INTERVAL, "AT+ADV_INTERVAL=", NULL},
  9. {AT_CMD_CON_INTERVAL, "AT+CON_INTERVAL=", NULL},
  10. {AT_CMD_ADV_ONOFF, "AT_ADV=", NULL},
  11. {AT_GET_VER, "AT+VERSION=", NULL},
  12. {AT_GET_CON_STATE, "AT+STATE", NULL},
  13. {AT_CMD_UART_CFG, "AT+UART_CFG=", NULL},
  14. {AT_END, NULL, NULL}};
  15. unsigned int mstrlen(const char *s)
  16. {
  17. const char *ss = s;
  18. while (*ss)
  19. ss++;
  20. return ss - s;
  21. }
  22. int mstrncmp(const char *s1, const char *s2, int n)
  23. {
  24. const unsigned char *c1 = (const unsigned char *)s1;
  25. const unsigned char *c2 = (const unsigned char *)s2;
  26. unsigned char ch;
  27. int d = 0;
  28. while (n--)
  29. {
  30. d = (int)(ch = *c1++) - (int)*c2++;
  31. if (d || !ch)
  32. break;
  33. }
  34. return d;
  35. }
  36. /* 指令执行函数 */
  37. unsigned char at_cmd_test(unsigned char *p, unsigned char len)
  38. {
  39. printf("AT+OK\r\n");
  40. return 0;
  41. }
  42. unsigned char at_cmd_name(unsigned char *p, unsigned char len)
  43. {
  44. if (*p == '?')
  45. {
  46. printf("AT+OK BLE-NAME\r\n");
  47. }
  48. else
  49. {
  50. printf("AT+OK\r\n");
  51. }
  52. return 0;
  53. }
  54. /* 查找指令表中对应的指令 */
  55. unsigned char AT_cmd_search(unsigned char *p, unsigned char len)
  56. {
  57. unsigned char ret = 0;
  58. // unsigned char *pstr;
  59. unsigned char i, n;
  60. for (i = 1; at_cmd_func[i].cmd != AT_END; i++)
  61. {
  62. n = mstrlen((const char *)at_cmd_func[i].str);
  63. if (!mstrncmp((const char *)p, (const char *)at_cmd_func[i].str, n))
  64. {
  65. ret = i;
  66. break;
  67. }
  68. }
  69. return ret;
  70. }
  71. /* AT指令解析 */
  72. unsigned char at_cmd_parse(unsigned char *p, unsigned char len)
  73. {
  74. unsigned char ret = AT_SUCCESS;
  75. unsigned char index = 0;
  76. if (len < 4)
  77. return AT_ERR; /* 不符合指令最小长度 */
  78. if ((p[0] == 'A') && (p[1] == 'T') && (p[len - 2] == 0x0D) && (p[len - 1] == 0x0A))
  79. {
  80. if (len == 4)
  81. { /* 测试指令 */
  82. if (at_cmd_func[AT_CMD_TEST].cb != NULL)
  83. at_cmd_func[AT_CMD_TEST].cb(NULL, 0); /* 执行测试指令 */
  84. }
  85. else if (p[2] == '+')
  86. { /* 执行指令解析 */
  87. index = AT_cmd_search(p, len); /* 查找匹配的执行指令,0-已匹配,!0-未匹配 */
  88. if (index)
  89. {
  90. if (at_cmd_func[index].cb != NULL)
  91. { /* 判断指令对应执行函数是否存在 */
  92. unsigned char n;
  93. n = mstrlen((const char *)at_cmd_func[index].str);
  94. ret = at_cmd_func[index].cb(p + n, len - n); /* 执行对应的指令函数, p+n:将指令参数传输执行函数,len-n-2:指令参数有效长度 */
  95. }
  96. else
  97. ret = AT_ERR_FUN_UNUSED; /* 没有可执行函数 */
  98. }
  99. else
  100. {
  101. ret = AT_ERR_UNINVAIL; /* 未找到匹配的指令 */
  102. }
  103. }
  104. }
  105. else
  106. { /* 格式不匹配 */
  107. return AT_ERR;
  108. }
  109. return ret;
  110. }