ml307a.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "ml307a.h"
  2. #include "mba32a.h"
  3. #include "usart.h"
  4. ML307AStep ml307astep;
  5. bool u4RecvFlag = false;
  6. bool ml307aFail = false;
  7. bool reset4Gmodule = false;
  8. bool module4G_F = false;
  9. uint8_t u4length=0;
  10. uint8_t resetcount_4g=0;
  11. uint8_t g_ML307A_8buf[2048]={0};
  12. uint8_t g_ML307A_8buf_Down[2048]={0};
  13. uint8_t MLBSLOCcount = 0;
  14. extern UART_HandleTypeDef huart3;
  15. extern UART_HandleTypeDef huart4;
  16. extern Menu_table menu;
  17. void ML307AReset(void);
  18. uint8_t sendCmd_4G(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum);
  19. uint8_t ML307A_JD[13]={0};
  20. uint8_t ML307A_WD[13]={0};
  21. void loction_4G(void);
  22. /**
  23. * @breaf 4G初始化
  24. */
  25. void ML307A_Init(void)
  26. {
  27. printf("\t###02\t4G_init%d...\r\n",resetcount_4g);
  28. switch(ml307astep)
  29. {
  30. case ATOK:
  31. {
  32. if (sendCmd_4G("AT\r\n", "OK", 1, 2))
  33. {
  34. printf("------->%s",g_ML307A_8buf_Down);
  35. printf("#4G模组正常\r\n");
  36. ml307astep++;
  37. }
  38. else
  39. {
  40. ml307astep = ML307AStepReset;
  41. }
  42. }
  43. case CFUN:
  44. {
  45. if (sendCmd_4G("AT+CFUN=1\r\n", "OK", 1, 2))
  46. {
  47. printf("------->%s",g_ML307A_8buf_Down);
  48. printf("#4G模组CFUN正常\r\n");
  49. ml307astep++;
  50. }
  51. else
  52. {
  53. ml307astep = ML307AStepReset;
  54. }
  55. }
  56. case SIMH:
  57. {
  58. if (sendCmd_4G("AT+MCFG=\"simhot\",1\r\n", "OK", 1, 2))
  59. {
  60. printf("------->%s",g_ML307A_8buf_Down);
  61. printf("#4G模组热插拔开启\r\n");
  62. ml307astep++;
  63. }
  64. else
  65. {
  66. ml307astep = ML307AStepReset;
  67. }
  68. }
  69. case CPIN:
  70. {
  71. if (sendCmd_4G("AT+CPIN?\r\n", "+CPIN: READY", 1, 5))
  72. {
  73. printf("------->%s",g_ML307A_8buf_Down);
  74. printf("#4G模组状态正常\r\n");
  75. ml307astep++;
  76. }
  77. else
  78. {
  79. ml307astep = ML307AStepReset;
  80. }
  81. }
  82. case CEREG:
  83. {
  84. if (sendCmd_4G("AT+CEREG?\r\n", "+CEREG: 0,1", 1, 2))
  85. {
  86. printf("------->%s",g_ML307A_8buf_Down);
  87. printf("#4G模组附着正常\r\n");
  88. printf("#4G模组初始化完成\r\n");
  89. ml307astep++;
  90. //break;
  91. }
  92. else
  93. {
  94. ml307astep = ML307AStepReset;
  95. }
  96. module4G_F=true;
  97. break;
  98. }
  99. // case MLB1:
  100. // {
  101. // if (sendCmd_4G("AT+MLBSCFG=\"method\",40\r\n", "OK", 1, 1))
  102. // {
  103. // printf("------->%s",g_ML307A_8buf_Down);
  104. // ml307astep++;
  105. // }
  106. // else
  107. // {
  108. // ml307astep = ML307AStepReset;
  109. // }
  110. // }
  111. //
  112. // case MLB2:
  113. // {
  114. // if(!sendCmd_4G("AT+MLBSCFG=\"pid\"\r\n", "Not referenced", 1, 1))
  115. // {
  116. // HAL_Delay(500);
  117. // printf("------->%s",g_ML307A_8buf_Down);
  118. // ml307astep++;
  119. //
  120. // }
  121. //
  122. // }
  123. //
  124. // case MLB3:
  125. // {
  126. // if (sendCmd_4G("AT+MLBSCFG=\"nearbtsen\",1\r\n", "OK", 1, 1))
  127. // {
  128. // printf("------->%s",g_ML307A_8buf_Down);
  129. // memset(g_ML307A_8buf_Down,0,u4length);
  130. // ml307astep++;
  131. // }
  132. // else
  133. // {
  134. // ml307astep = ML307AStepReset;
  135. // }
  136. // module4G_F=true;
  137. // break;
  138. // }
  139. case ML307AStepReset:
  140. {
  141. ml307astep = ATOK;
  142. ML307AReset();
  143. }
  144. }
  145. // menu.current=0;//回到初始
  146. // refresh=true;
  147. }
  148. /**
  149. * @breaf 4G发送串口命令
  150. */
  151. uint8_t sendCmd_4G(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum)
  152. {
  153. uint8_t i = 0;
  154. uint32_t time;
  155. for(i = 0; i < sendNum; i++)
  156. {
  157. time = timeOut * 10;
  158. memset(g_ML307A_8buf_Down,0,u4length);
  159. USART_SendString(&huart4, pCmd);
  160. HAL_Delay(700);
  161. while(time--)
  162. {
  163. if(strstr((const char *)g_ML307A_8buf_Down, pRes) != NULL) // 如果检索到关键词
  164. {
  165. return 1;
  166. }
  167. HAL_Delay(100);
  168. }
  169. }
  170. return 0;
  171. }
  172. /**
  173. @brief 重启模块
  174. @param 无
  175. @return 无
  176. */
  177. void ML307AReset(void)
  178. {
  179. reset4Gmodule=true;
  180. module4G_F=false;
  181. resetcount_4g+=1;
  182. printf("4G Module_Reset\n");
  183. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
  184. HAL_Delay(5000);
  185. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
  186. }
  187. void loction_4G(void)
  188. {
  189. MLBSLOCcount+=1;
  190. if(module4G_F)
  191. {
  192. //定位状态码、精度、纬度、定位精度、具体位置信息
  193. //sendCmd_4G("AT+MLBSLOC\r\n", "OK", 1, 1);
  194. {//MQTT 测试
  195. sendCmd_4G("AT+MQTTCFG=?\r\n", "OK", 1, 1);
  196. HAL_Delay(10000);
  197. printf("%s",g_ML307A_8buf_Down);
  198. }
  199. //AL_Delay(5000);
  200. //printf("------->%s",g_ML307A_8buf_Down);
  201. memset(g_ML307A_8buf_Down,0,u4length);
  202. }
  203. }