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.

134 lines
3.0 KiB

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