at_cmd.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: at_cmd.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2014-06-10
  7. 功能说明: AT指令处理实现文件.
  8. 其它说明:
  9. 修改记录:
  10. */
  11. #include "at_cmd.h"
  12. #ifndef __KERNEL__
  13. #include <stdio.h>
  14. #include <sys/types.h>
  15. #include <sys/stat.h>
  16. #include <fcntl.h>
  17. #include <termios.h>
  18. #include <time.h>
  19. #include <stdlib.h>
  20. #include <unistd.h>
  21. #include <sys/select.h>
  22. #include <string.h>
  23. #include <sys/ioctl.h>
  24. #define sys_open open
  25. #define sys_close close
  26. #define sys_ioctl ioctl
  27. #define sys_write write
  28. #define sys_read read
  29. #define sys_select select
  30. #define printk printf
  31. #else
  32. #include <linux/kernel.h>
  33. #include <linux/init.h>
  34. #include <linux/module.h>
  35. #include <linux/moduleparam.h>
  36. #include <linux/fs.h>
  37. #include <linux/sched.h>
  38. #include <linux/interrupt.h>
  39. #include <linux/kthread.h>
  40. #include <linux/delay.h>
  41. #include <linux/wait.h>
  42. #include <asm/uaccess.h>
  43. #include <asm/io.h>
  44. #include <asm/ioctls.h>
  45. #include <linux/syscalls.h>
  46. #include <termios.h>
  47. #endif
  48. /******************************************************************************
  49. 函数名称: at_cmd_send_and_ret
  50. 函数版本: 01.01
  51. 创建作者: xxxxxx
  52. 创建日期: 2014-06-10
  53. 函数说明: 发送AT指令,并返回内容.
  54. 参数说明:
  55. serialname:指定使用哪一个串口发送AT指令
  56. cmd: AT指令
  57. len:指令长度.
  58. result: 返回的内容
  59. 返回值: 成功返回0,失败返回负数。
  60. 修改记录:
  61. */
  62. int at_cmd_send_and_ret(char *serialname, char *cmd, int len, char *result)
  63. {
  64. int fd = 0;
  65. int i = 0;
  66. int j = 0;
  67. int ret = 0;
  68. fd_set fds;
  69. struct timeval tv;
  70. char buf[512];
  71. char ch[]={'>', 0x00};
  72. memset(buf, 0, sizeof(buf));
  73. fd = sys_open(serialname, O_RDWR, 0);
  74. if(fd < 0 )
  75. {
  76. printk("open %s error\n", serialname);
  77. return -1;
  78. }
  79. //发送AT指令
  80. ret= sys_write(fd, cmd, strlen(cmd));
  81. if(ret < 0)
  82. {
  83. printk("write error(%d)\n", ret);
  84. goto end;
  85. }
  86. //等待AT指令响应
  87. while(1)
  88. {
  89. FD_ZERO(&fds);
  90. FD_SET(fd, &fds);
  91. tv.tv_sec = 0;
  92. tv.tv_usec =500000;
  93. ret = sys_select(fd+1, &fds, NULL, NULL, &tv);
  94. if(ret > 0)
  95. {
  96. //读取响应数据
  97. ret = sys_read(fd, buf+i, sizeof(buf)-i-1);
  98. if(ret > 0)
  99. {
  100. memcpy(result+j, buf+i, ret);
  101. j = j + ret;
  102. buf[i+ret] = 0;
  103. //printk("%s", buf+i);
  104. //AT指令响应OK表示成功
  105. if(strstr(buf, "OK") || strstr(buf, ch))
  106. {
  107. //printk("%s", buf);
  108. ret = 0;
  109. break;
  110. }
  111. }
  112. //防止数组越界.目前只使用AT,AT+CIMI两条指令,是不会越界的.
  113. i = i + ret;
  114. if(i >= (sizeof(buf)-1))
  115. {
  116. i = 0;
  117. memset(buf, 0, sizeof(buf));
  118. }
  119. } else {
  120. ret = -1;
  121. break;
  122. }
  123. }
  124. end:
  125. sys_close(fd);
  126. return ret;
  127. }
  128. /******************************************************************************
  129. 函数名称: at_cmd_send
  130. 函数版本: 01.01
  131. 创建作者: xxxxxx
  132. 创建日期: 2014-06-10
  133. 函数说明: 发送AT指令.
  134. 参数说明:
  135. serialname:指定使用哪一个串口发送AT指令.
  136. cmd: AT指令
  137. len:指令长度.
  138. 返回值: 成功返回0,失败返回负数。
  139. 修改记录:
  140. */
  141. int at_cmd_send(char *serialname, char *cmd, int len)
  142. {
  143. int fd = 0;
  144. int i = 0;
  145. int ret = 0;
  146. fd_set fds;
  147. struct timeval tv;
  148. char buf[512];
  149. char ch[]={'>', 0x00};
  150. memset(buf, 0, sizeof(buf));
  151. fd = sys_open(serialname, O_RDWR , 0);
  152. if(fd < 0 )
  153. {
  154. printk("open %s error\n", serialname);
  155. return -1;
  156. }
  157. //发送AT指令
  158. ret= sys_write(fd, cmd, strlen(cmd));
  159. if(ret < 0)
  160. {
  161. printk("write error(%d)\n", ret);
  162. goto end;
  163. }
  164. //等待AT指令响应
  165. while(1)
  166. {
  167. FD_ZERO(&fds);
  168. FD_SET(fd, &fds);
  169. //tv.tv_sec = 0;
  170. //tv.tv_usec =500000;
  171. tv.tv_sec = 1;
  172. tv.tv_usec =0;
  173. ret = sys_select(fd+1, &fds, NULL, NULL, &tv);
  174. if(ret > 0)
  175. {
  176. //读取响应数据
  177. ret = sys_read(fd, buf+i, sizeof(buf)-i-1);
  178. if(ret > 0)
  179. {
  180. buf[i+ret] = 0;
  181. //printk("%s", buf+i);
  182. //AT指令响应OK表示成功
  183. if(strstr(buf, "OK") || strstr(buf, ch))
  184. {
  185. //printk("%s", buf);
  186. ret = 0;
  187. break;
  188. }
  189. }
  190. //防止数组越界.目前只使用AT,AT+CIMI两条指令,是不会越界的.
  191. i = i + ret;
  192. if(i >= (sizeof(buf)-1))
  193. {
  194. i = 0;
  195. memset(buf, 0, sizeof(buf));
  196. }
  197. } else {
  198. ret = -1;
  199. break;
  200. }
  201. }
  202. end:
  203. sys_close(fd);
  204. return ret;
  205. }