net4g.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. #include "net4g.h"
  2. extern UART_HandleTypeDef huart3;
  3. extern UART_HandleTypeDef huart4;
  4. extern UART_HandleTypeDef huart5;
  5. extern UART_HandleTypeDef huart1;
  6. uint8_t step_4G = 0;
  7. bool resetML307A =false;
  8. uint32_t g_ML307ACnt =0; // 接收计数
  9. uint8_t g_ML307A_8buf[200] ={0} ;
  10. uint8_t g_ML307A_8buf_Down[200]={0};
  11. uint8_t u4RecvFlag = 0; // 串口4接收标志串口接收完成标志
  12. //char g_ML307A_8buf_Down[100] = {0}; // 接收缓存
  13. uint8_t ML307A_Init(void)
  14. {
  15. //startDTU=false;
  16. // int txLen = sprintf((char *)recvBuff, "ML307A_Init...\r\n");
  17. // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1));
  18. // uint8_t result = 0;
  19. #ifdef debug4GInfo
  20. #if debug4GInfo == 1
  21. printf("ML307A_Init...\r\n");
  22. #endif
  23. #endif
  24. switch(step_4G)
  25. {
  26. case 0:
  27. if(sendCmd("AT\r\n","OK", 10, 5)) // 测试AT指令功能是否正常
  28. {
  29. step_4G++;
  30. #ifdef debug4GInfo
  31. #if debug4GInfo == 1
  32. printf("CMD:AT\t##Reply message matching\r\n");
  33. #endif
  34. #endif
  35. //start4G=false;
  36. }
  37. else
  38. {
  39. #ifdef debug4GInfo
  40. #if debug4GInfo == 1
  41. printf("Err:AT\r\n");
  42. #endif
  43. #endif
  44. reset_4G();
  45. break;
  46. }
  47. // case 1:
  48. // if(sendCmd("AT+CPIN?\r\n","+CPIN: READY\r\n\r\nOK", 20, 2)) // 查询SIM卡是否正常,返回ready则表示SIM卡正常
  49. // {
  50. // step_4G++;
  51. // int txLen = sprintf((char *)recvBuff, "CPIN OK\r\n");
  52. // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1));
  53. // }
  54. // else
  55. // {
  56. // printf("Err:AT+CPIN?\r\n"); // 20秒内,无法识别SIM状态,重启模块
  57. // reset_4G();
  58. // break;
  59. // }
  60. // case 2:
  61. // if(sendCmd("AT+CREG?\r\n","+CREG: 0,1", 90, 2)) // 查询模组是否注册上GSM网络
  62. // {
  63. // step_4G++;
  64. // int txLen = sprintf((char *)recvBuff, "CREG OK\r\n");
  65. // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1));
  66. // }
  67. // else
  68. // {
  69. // printf("Err:AT+CREG?\r\n"); // 90秒内,没有注册上CS业务,重启模块
  70. // reset_4G();
  71. // break;
  72. // }
  73. // case 3:
  74. // if(sendCmd("AT+CGREG?\r\n","+CGREG: 0,1", 60, 2)) // 查询模组是否注册上GPRS网络
  75. // {
  76. // step_4G++;
  77. // }
  78. // else
  79. // {
  80. // printf("Err:AT+CGREG?\r\n"); // 60秒内,没有注册上PS业务
  81. // reset();
  82. // break;
  83. // }
  84. // case 4:
  85. // if(sendCmd("AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n", "OK", 40, 3)) // 查询模组是否注册上GPRS网络
  86. // {
  87. // result = ML307A_NetConfig();
  88. // }
  89. // else
  90. // {
  91. // printf("Err:AT+QICSGP=1,1\r\n"); // 如果3次都没停止成功或超过40秒没有回应,则重启模块
  92. // reset();
  93. // break;
  94. // }
  95. }
  96. //return result;
  97. return 1;
  98. }
  99. uint8_t ML307A_NetConfig(void)
  100. {
  101. //uint8_t result = 0;
  102. // if(sendCmd("AT+QIDEACT=1\r\n", "OK", 40, 1)) // 在激活GPRS场景之前先关闭GPRS场景,确保连接正确
  103. // {
  104. // if(sendCmd("AT+QIACT=1\r\n", "OK", 150, 1)) // 激活移动场景
  105. // {
  106. // ML307A_Connect();
  107. // }
  108. // else // 等待150秒后,没有响应重启模块
  109. // {
  110. // printf("Err:AT+QIACT=1\r\n"); // 重启模块
  111. // reset();
  112. // }
  113. return 1;
  114. // }
  115. // else // 等待40秒后,没有响应重启模块
  116. // {
  117. // printf("Err:AT+QIDEACT=1\r\n"); // 重启模块
  118. // reset();
  119. // return 0;
  120. // }
  121. }
  122. /**
  123. @brief 连接TCP服务器
  124. @param 无
  125. @return 无
  126. */
  127. void ML307A_Connect(void)
  128. {
  129. if(sendCmd("AT+QIOPEN=1,0,\"TCP\",\"180.97.81.180\",53540,0,1\r\n", "+QIOPEN:", 150, 5))
  130. {
  131. printf("Connect Success\r\n");
  132. }
  133. else
  134. {
  135. printf("Err:AT+QIOPEN=1,0\r\n");
  136. }
  137. }
  138. /**
  139. @brief 发送数据到TCP服务器
  140. @param pString -[in] 发送数据
  141. @return 无
  142. */
  143. void ML307A_Send(char *pString)
  144. {
  145. if(sendCmd("AT+QISEND=0\r\n", ">", 60, 1))
  146. {
  147. if(sendCmd("AT+QISEND=0,0\r\n", "\r\nOK", 5, 24)) // 2分钟后(每5秒查询一次,共24次)
  148. {
  149. /* 发送数据成功,对方收到数据 */
  150. }
  151. else
  152. {
  153. printf("Err:AT+QISEND=0\r\n");
  154. if(sendCmd("AT+QICLOSE=0\r\n", "OK", 10, 1)) // TCP连接出现异常,关闭TCP连接
  155. {
  156. printf("AT+QICLOSE\r\n");
  157. ML307A_Connect();
  158. }
  159. else
  160. {
  161. reset_4G(); // 等待10秒,没有响应重启模块
  162. }
  163. }
  164. }
  165. else
  166. {
  167. reset_4G(); // 等待60秒,没有响应重启模块
  168. }
  169. }
  170. /**
  171. @brief 从TCP服务器接收数据
  172. @param pRecvDataBuf -[out] 接收数据
  173. @return 接收数据长度
  174. */
  175. uint32_t ML307A_Receive(char *pRecvDataBuf)
  176. {
  177. uint32_t recvDataLen = 0;
  178. if(u4RecvFlag) // 如果串口接收完成
  179. {
  180. if(strstr((const char *)g_ML307A_8buf_Down, "+QIURC: \"recv\",0,") != NULL) // 如果检索到关键词
  181. {
  182. memcpy(pRecvDataBuf, g_ML307A_8buf_Down, g_ML307ACnt);
  183. recvDataLen = g_ML307ACnt;
  184. }
  185. clearBuffer();
  186. }
  187. return recvDataLen;
  188. }
  189. void USART_SendString(UART_HandleTypeDef *huart, char *str)
  190. {
  191. HAL_UART_Transmit(huart, (uint8_t*)str, strlen(str), 0xFFFF);
  192. HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), 0xFFFF);//485
  193. HAL_UART_Transmit(&huart3, (uint8_t*)str, strlen(str), 0xFFFF);//ttl
  194. }
  195. void USART_SendHexArray(UART_HandleTypeDef *huart, uint8_t *data, int length)
  196. {
  197. HAL_UART_Transmit(huart,data, length, 0xFFFF);
  198. HAL_UART_Transmit(&huart1,data, length, 0xFFFF);//485
  199. HAL_UART_Transmit(&huart3, data, length, 0xFFFF);//ttl
  200. }
  201. /*********************************************************************
  202. * LOCAL FUNCTIONS
  203. */
  204. /**
  205. @brief 发送AT命令
  206. @param pCmd -[in] 命令字符串
  207. @param pRes -[in] 需要检测的返回命令字符串
  208. @param timeOut -[in] 等待时间
  209. @param sendNum -[in] 命令发送次数
  210. @return 1 - 成功;0 - 失败
  211. */
  212. uint8_t sendCmd(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum)
  213. {
  214. uint8_t i = 0;
  215. uint32_t time;
  216. clearBuffer(); // 清空缓存
  217. for(i = 0; i < sendNum; i++)
  218. {
  219. time = timeOut * 10;
  220. USART_SendString(&huart4, pCmd);
  221. // int txLen = sprintf((char *)recvBuff, "Send AT >>%s",pCmd);
  222. // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1));
  223. #ifdef debug4GInfo
  224. #if debug4GInfo == 1
  225. printf("Send AT >>%s",pCmd);
  226. #endif
  227. #endif
  228. while(time--)
  229. {
  230. if(u4RecvFlag) // 如果串口接收完成
  231. {
  232. HAL_Delay(10);
  233. // int txLen = sprintf((char *)recvBuff, "R_AT >>%s<<",g_ML307A_8buf_Down);
  234. // HAL_UART_Transmit(&huart1,recvBuff,txLen,(txLen-1));
  235. // HAL_UART_Transmit(&huart3,recvBuff,txLen,(txLen-1));
  236. // HAL_UART_Transmit(&huart4, (uint8_t *)g_ML307A_8buf_Down, recvLength, HAL_MAX_DELAY);
  237. #ifdef debug4GInfo
  238. #if debug4GInfo == 1
  239. printf("RE>>%s",g_ML307A_8buf_Down);
  240. #endif
  241. #endif
  242. if(strstr((const char *)g_ML307A_8buf_Down, pRes) != NULL) // 如果检索到关键词
  243. {
  244. //printf("%s", g_ML307A_8buf_Down);
  245. return 1;
  246. }
  247. else{
  248. u4RecvFlag = 0;
  249. //printf("null %s", g_ML307A_8buf_Down);
  250. }
  251. }
  252. HAL_Delay(100); // 等待100毫秒
  253. }
  254. clearBuffer();
  255. }
  256. return 0;
  257. }
  258. /**
  259. @brief 清空缓存
  260. @param 无
  261. @return 无
  262. */
  263. void clearBuffer(void)
  264. {
  265. recvLength = 0;//清除计数
  266. recvDndFlag = 0;//清除接收结束标志位
  267. memset(g_ML307A_8buf_Down, 0, 500);
  268. memset(g_ML307A_8buf_Down, 0, 500);
  269. u4RecvFlag = 0;
  270. printf("bufclear\r\n");
  271. }
  272. /**
  273. @brief 重启模块
  274. @param 无
  275. @return 无
  276. */
  277. void reset_4G(void)
  278. {
  279. printf("reset_4g\n");
  280. step_4G = 0;
  281. resetML307A = true;
  282. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
  283. HAL_Delay(5000);
  284. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
  285. }