GSM_func.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #include "main.h"
  2. //// C lib
  3. //#include <stdlib.h>
  4. //#include <string.h>
  5. //#include <stdio.h>
  6. //// system
  7. //#include "delay.h"
  8. //// GSM
  9. //#include "GSM_config.h"
  10. static char* GSM_check_cmd(char *str);
  11. <<<<<<< HEAD
  12. static char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime);
  13. static char GSM_consta_check(void);
  14. static void GSM_get_wanip(char* ipbuf);
  15. static void GSM_sendData(char* fmt,...);
  16. // GSM信息 联网的GSM名称和密码
  17. const char* GSM_phoneNum="18782876903";
  18. const char* GSM_message="help me";
  19. =======
  20. static void GSM_sendData(char* fmt,...);
  21. // GSM信息
  22. const char* GSM_phoneNum = "19198022169";
  23. const char* GSM_head = "send:";
  24. >>>>>>> updata
  25. /**
  26. * @brief 向GSM串口发送数据
  27. * @param fmt: 类似printf的数据格式
  28. * @retval None
  29. * @note None
  30. */
  31. void GSM_sendData(char* fmt,...)
  32. {
  33. uint16_t i,j;
  34. va_list ap;
  35. va_start(ap,fmt);
  36. vsprintf((char*)GSM_USART_TX_BUF,fmt,ap);
  37. va_end(ap);
  38. i = strlen((const char*)GSM_USART_TX_BUF);
  39. for(j=0; j<i; j++)
  40. {
  41. while(USART_GetFlagStatus(GSM_USARTx,USART_FLAG_TC)==RESET);
  42. USART_SendData(GSM_USARTx,GSM_USART_TX_BUF[j]);
  43. }
  44. }
  45. /**
  46. <<<<<<< HEAD
  47. * @brief 清零缓存区并清零接收标志
  48. * @param None
  49. * @retval None
  50. * @note None
  51. */
  52. void GSM_clear(void)
  53. {
  54. memset(GSM_USART_RX_BUF, 0, GSM_USART_MAX_RECV_LEN);
  55. GSM_USART_RX_STA = 0;
  56. }
  57. /**
  58. =======
  59. >>>>>>> updata
  60. * @brief 检测应答
  61. * @param str: 期待的应答结果
  62. * @retval 0: 没有接收到期待应答
  63. * @retval !0: 其他值代表期待应答结果的位置
  64. * @note None
  65. */
  66. static char* GSM_check_cmd(char *str)
  67. {
  68. char *strx=0;
  69. // 接收到一次数据了
  70. if(GSM_USART_RX_STA&0X8000)
  71. {
  72. // 添加结束符
  73. GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0;
  74. // 检索字符串
  75. strx=strstr(GSM_USART_RX_BUF,str);
  76. #ifdef DEBUG_printf
  77. printf("rec data: %s\n",GSM_USART_RX_BUF);
  78. #endif
  79. }
  80. return strx;
  81. }
  82. /**
  83. * @brief 向GSM发送命令
  84. * @param cmd: 发送的命令字符串
  85. * @param ack: 期待的应答结果,如果为空,则表示不需要等待应答
  86. * @param waittime: 等待时间(单位:10ms)
  87. * @retval 0: 发送成功(得到了期待的应答结果),
  88. * @retval 1: 发送失败
  89. * @note None
  90. */
  91. <<<<<<< HEAD
  92. static char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime)
  93. =======
  94. char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime)
  95. >>>>>>> updata
  96. {
  97. char res=0;
  98. GSM_USART_RX_STA=0;
  99. //发送命令
  100. GSM_sendData("%s",cmd);
  101. if(ack&&waittime) //需要等待应答
  102. {
  103. while(--waittime) //等待倒计时
  104. {
  105. DELAYClass.DelayMs(10);
  106. if(GSM_USART_RX_STA&0X8000)//接收到期待的应答结果
  107. {
  108. <<<<<<< HEAD
  109. if(*GSM_check_cmd(ack))
  110. =======
  111. if(GSM_check_cmd(ack) != ((void *)0))
  112. >>>>>>> updata
  113. {
  114. break; // 得到有效数据
  115. }
  116. GSM_USART_RX_STA=0;
  117. }
  118. }
  119. if(waittime==0)res=1;
  120. }
  121. return res;
  122. }
  123. /**
  124. <<<<<<< HEAD
  125. * @brief 发送短信
  126. * @param None
  127. * @retval None
  128. * @note None
  129. */
  130. void GSM_sendMessage(void)
  131. =======
  132. * @brief string转换int
  133. * @param *str:字符串地址
  134. * @retval 返回int型
  135. * @note None
  136. */
  137. int stringToInt(char *str)
  138. {
  139. char *p = str;
  140. int nNUM = 0;
  141. while (*p >= '0' && *p <= '9')
  142. {
  143. nNUM = nNUM * 10 + (*p - '0');
  144. p++;
  145. }
  146. return nNUM;
  147. }
  148. /**
  149. * @brief 发送短信
  150. * @param None
  151. * @retval None
  152. */
  153. void GSM_sendMessage(char *message)
  154. >>>>>>> updata
  155. {
  156. char p[40];
  157. #ifdef DEBUG_printf
  158. <<<<<<< HEAD
  159. printf("1. AT+CPIN?\n");
  160. #endif
  161. while(GSM_send_cmd("AT+CPIN?\r\n","OK",100)); // 查询卡状态
  162. #ifdef DEBUG_printf
  163. =======
  164. printf("0. AT+CPIN?\n");
  165. #endif
  166. while(GSM_send_cmd("AT+CPIN?\r\n","OK",100)); // 查询卡状态
  167. #ifdef DEBUG_printf
  168. printf("1. AT+CMGF=1\n");
  169. #endif
  170. while(GSM_send_cmd("AT+CMGF=1\r\n","OK",100)); // 设置TXT模式
  171. #ifdef DEBUG_printf
  172. >>>>>>> updata
  173. printf("2. AT+CMGS=\n");
  174. #endif
  175. sprintf((char*)p,"AT+CMGS=\"%s\"\r\n",GSM_phoneNum); // 设置目标手机号
  176. while(GSM_send_cmd(p,">",100));
  177. DELAYClass.DelayMs(50);
  178. #ifdef DEBUG_printf
  179. <<<<<<< HEAD
  180. printf("3. %s\n",GSM_message);
  181. #endif
  182. sprintf((char*)p,"%s\r\n",GSM_message); // 设置发送内容
  183. =======
  184. printf("3. %s\n",message);
  185. #endif
  186. sprintf((char*)p,"%s\r\n",message); // 设置发送内容
  187. >>>>>>> updata
  188. GSM_send_cmd(p,">",100);
  189. DELAYClass.DelayMs(50);
  190. #ifdef DEBUG_printf
  191. printf("4. %x\n", 0x1A);
  192. #endif
  193. USART_SendData(USART2, 0x1A); // 确认发送
  194. }
  195. <<<<<<< HEAD
  196. =======
  197. /**
  198. * @brief 等待接收短信
  199. * @param None
  200. * @retval 0:无短信,!0:接收到的短信的存放地址
  201. */
  202. uint8_t GSM_waitMessage(void)
  203. {
  204. // 接收到一次数据了
  205. if(GSM_USART_RX_STA&0X8000)
  206. {
  207. GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0; // 添加结束符
  208. #ifdef DEBUG_printf
  209. printf("(waitMes)%s\n", GSM_USART_RX_BUF);
  210. #endif
  211. char *strx = 0;
  212. // 检索字符串 含有"SM",则代表接收到短信
  213. strx=strstr(GSM_USART_RX_BUF,"\"SM\",");
  214. // 返回不为空则检索到指定字符串
  215. if(strx != ((void *)0))
  216. {
  217. #ifdef DEBUG_printf
  218. printf("message rec success, addr : %d\n", stringToInt(strx+5));
  219. #endif
  220. uint8_t addrNum = stringToInt(strx+5); // 将地址号保存
  221. GSM_USART_RX_STA = 0; // 清除接收标记
  222. return addrNum;
  223. }
  224. GSM_USART_RX_STA = 0;
  225. }
  226. return 0;
  227. }
  228. /**
  229. * @brief 查看短信
  230. * @param None
  231. * @retval 返回帧头后的一个字节数据
  232. */
  233. char GSM_readMessage(uint8_t addrNum)
  234. {
  235. char pp[40];
  236. uint8_t i = 0;
  237. sprintf((char*)pp,"AT+CMGR=%d\r\n",addrNum); // 查看该地址下的短信
  238. GSM_USART_RX_STA = 0;
  239. // 等待2s
  240. for(i = 0; i <= 200; i++)
  241. {
  242. if(i % 50 == 0) // 每0.5s重发一次
  243. {
  244. #ifdef DEBUG_printf
  245. printf("i = %d\n", i);
  246. #endif
  247. GSM_sendData("%s", pp);
  248. }
  249. DELAYClass.DelayMs(10);
  250. if(GSM_USART_RX_STA&0X8000)
  251. {
  252. // 添加结束符
  253. GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0;
  254. #ifdef DEBUG_printf
  255. printf("(readMes)%s\n", GSM_USART_RX_BUF);
  256. #endif
  257. char *strx = 0;
  258. // 检索字符串 含有"send:",则代表查看短信成功
  259. strx=strstr(GSM_USART_RX_BUF,GSM_head);
  260. // 返回不为空则检索到指定字符串
  261. if(strx != ((void *)0))
  262. {
  263. #ifdef DEBUG_printf
  264. printf("message read success, cmd : %c\n", strx[5]);
  265. #endif
  266. char cmd = 0;
  267. cmd = strx[5]; // 此处可根据需求修改 当前是返回的send:后的一个字节
  268. GSM_USART_RX_STA = 0; // 清除接收标记
  269. DELAYClass.DelayMs(10);
  270. sprintf((char*)pp,"AT+CMGD=%d\r\n",addrNum); // 删除该地址下的短信
  271. GSM_sendData("%s", pp);
  272. return cmd;
  273. }
  274. GSM_USART_RX_STA = 0;
  275. }
  276. }
  277. GSM_USART_RX_STA = 0;
  278. return 0;
  279. }
  280. >>>>>>> updata
  281. /**
  282. * @brief GSM初始化
  283. * @param None
  284. * @retval None
  285. * @note None
  286. */
  287. void GSM_Init(void)
  288. {
  289. GSM_USART_Init(9600);
  290. GSM_TIM3_Init();
  291. }