===================================================
GPRS模块:sim900
开发板:fl2440
内核版本:linux3.0
交叉编译器:arm-Linux 4.5.4
=====================================================
使用C语言编写的一个简单的控制sim900打电话和发送短信,下面是代码
- #include <termios.h>
- 2 #include <stdio.h>
- 3 #include <stdlib.h>
- 4 #include <unistd.h>
- 5 #include <fcntl.h>
- 6 #include <string.h>
- 7 #include <sys/types.h>
- 8 #include <sys/stat.h>
- 9 struct message_info{
- 10 char cnnu[16];
- 11 char phnu[16];
- 12 char message[128];
- 13 };
- 14 struct pdu_info {
- 15 char cnswap[32];
- 16 char phswap[32];
- 17 };
- 18 void serial_init(int fd)
- 19 {
- 20 struct termios options; /**/
- 21 tcgetattr(fd, &options); /*该函数与设备文件绑定*/
- 22 options.c_cflag |= ( CLOCAL | CREAD ); /*这两个保证程序不会成为终端的所有者,用于本地接受和发送*/
- 23 options.c_cflag &= ~CSIZE; /*字符大小屏蔽*/
- 24 options.c_cflag &= ~CRTSCTS;/*不使用数据控制流,RTS/CTS流控制 rts ctc 是一种通信协议*/
- 25 options.c_cflag |= CS8; /* 把数据设置为8位*/
- 26 options.c_cflag &= ~CSTOPB; /*空格校验*/
- 27 options.c_iflag |= IGNPAR; /*忽略奇偶错字符*/
- 28 options.c_oflag = 0;
- 29 options.c_lflag = 0;
- 30 cfsetispeed(&options, B115200); /*设置端口的输入波特率*/
- 31 cfsetospeed(&options, B115200); /*设置端口的输出波特率*/
- 32 tcsetattr(fd,TCSANOW,&options); /*激活配置,使其生效,第二个参数为 更改立即生效*/
- 33 }
- void swap(char number[],char swap[])
- 35 {
- 36 char ch1[] = "86";
- 37 char tmp[16];
- 38 int i;
- 39 memset(swap,0,32);
- 40 memset(tmp,0,16);
- 41 strcpy(swap,number);
- 42 strcat(swap,"f");
- 43 strcat(ch1,swap);
- 44 strcpy(swap,ch1);
- 45
- 46 for(i = 0;i <= strlen(swap) - 1;i += 2){
- 47 tmp[i + 1] = swap[i];
- 48 tmp[i] = swap[i + 1];
- 49 }
- 50 strcpy(swap,tmp);
- 51 }
- 52 int send(int fd,char *cmgf,char *cmgs,char *message)
- 53 {
- 54 int nread,nwrite;
- 55 char buff[128];
- 56 char reply[128];
- 57 memset(buff,0,sizeof(buff));
- 58 strcpy(buff,"at\r");
- 59 nwrite = write(fd,buff,strlen(buff));
- 60 printf("nwrite=%d,%s\n",nwrite,buff);
- 61 memset(reply,0,sizeof(reply));
- 62 sleep(1);
- 63 nread = read(fd,reply,sizeof(reply));
- 64 printf("nread=%d,%s\n",nread,reply);
- 65 memset(buff,0,sizeof(buff));
- 66 strcpy(buff,"AT+CMGF=");
- 67 strcat(buff,cmgf);
- 68 strcat(buff,"\r");
- 69 nwrite = write(fd,buff,strlen(buff));
- 70 printf("nwrite=%d,%s\n",nwrite,buff);
- 71 memset(reply,0,sizeof(reply));
- 72 sleep(1);
- 73 nread = read(fd,reply,sizeof(reply));
- 74 printf("nread=%d,%s\n",nread,reply);
- 75 memset(buff,0,sizeof(buff));
- 76 strcpy(buff,"AT+CMGS=\"");
- 77 strcat(buff,cmgs);
- 78
- 79 strcat(buff,"\"");
- 80 strcat(buff,"\r");
- 81 nwrite = write(fd,buff,strlen(buff));
- 82 printf("nwrite=%d,%s\n",nwrite,buff);
- 83 memset(reply,0,sizeof(reply));
- 84 sleep(1);
- 85 nread = read(fd,reply,sizeof(reply));
- 86 printf("nread=%d,%s\n",nread,reply);
- 87 memset(buff,0,sizeof(buff));
- 88 strcpy(buff,message);
- 89 nwrite = write(fd,buff,strlen(buff));
- 90 printf("nwrite=%d,%s\n",nwrite,buff);
- 91 memset(reply,0,sizeof(reply));
- 92 sleep(1);
- 93 nread = read(fd,reply,sizeof(reply));
- 94 printf("nread=%d,%s\n",nread,reply);
- 95 }
- 96 int send_en_message(int fd,struct message_info info)
- 97 {
- 98 getchar(); /*把缓冲区的回车吃掉*/
- 99 char cmgf[] = "1";
- 100 int conter = 0;
- 101 char cmgs[16] = {'\0'};
- 102 printf("enter recever phnumber :\n");
- 103 gets(info.phnu);
- 104 while(strlen(info.phnu) != 11){
- 105 if(conter >= 3){
- 106 printf("conter out !\n");
- 107 return -1;
- 108 }
- 109 printf("number shuld be --11-- bits ! enter agin :\n");
- 110 gets(info.phnu);
- 111 conter ++;
- 112 }
- 113 printf("enter you message !\n");
- 114 gets(info.message);
- 115 strcat(info.message,"\x1a");
- 116 strcat(cmgs,info.phnu);
- 117 send(fd,cmgf,cmgs,info.message);
- 118 }
- 119
- 120 int call_telephone(int fd)
- 121 {
- 122 getchar();
- 123 int count=0;
- 124 int num_lenth;
- 125 char call_num[128];
- 126 int nwrite,nread;
- 127 int * a;
- 128 int h;
- 129 char buff[128];
- 130
- 131
- 132 printf("enter your centre phnumber :\n");
- 133 gets(call_num);
- 134 num_lenth=strlen(call_num);
- 135 while(num_lenth!=11)
- 136 {
- 137 if(count>3)
- 138 {
- 139 printf("count out !!\n");
- 140 return -1;
- 141 }
- 142
- 143 count++;
- 144 printf("please input -- 11--bits!\n");
- 145 gets(call_num);
- 146 num_lenth=strlen(call_num);
- 147 }
- 148 memset(buff,0,sizeof(buff));
- 149 strcpy(buff,"atd");
- 150 printf("buff=%s\n",buff);
- 151 strcat(buff,call_num);
- 152 strcat(buff,";\r");
- 153 nwrite=write(fd,buff,strlen(buff));
- 154 sleep(3);
- 155 memset(buff,0,sizeof(buff));
- 156 nread=read(fd,buff,sizeof(buff));
- 157 printf("buff=%s\n",buff);
- 158 printf("++++++++++++++++++++++\n");
- 159
- 160 printf("press 2 hung up\n");
- 161 printf("++++++++++++++++++++++\n");
- 162 sleep(1);
- 163 scanf("%d",&h);
- 164 printf("h=%d",h) ;
- 165 while(h!=2)
- 166 {
- 167 printf("please input currect num\n");
- 168 scanf("%d",&h);
- 169 }
- 170 memset(buff,0,sizeof(buff));
- 171 strcpy(buff,"ATH\r");
- 172 write(fd,buff,sizeof(buff));
- 173 printf("has hunged up");
- 174 return 0;
- 175 /* while(1)
- 176 {
- 177
- 178 memset(buff,0,sizeof(buff));
- 179 nread=read(fd,buff,sizeof(buff));
- 180 a=strstr(buff,"BUSY");
- 181 return 0;
- 182 }
- 183 */
- 184
- 185
- 186 }
- 187
- 188 int main()
- 189 {
- 190 int fd;
- 191 char choice;
- 192 struct message_info info;
- 193 fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
- 194 if (-1 == fd){
- 195 perror("Can't Open Serial Port");
- 196 }
- 197 serial_init(fd);
- 198 printf("\n============================================\n");
- 199 printf("\tthis is a gprs test program !\n");
- 200 printf("============================================\n");
- 201 printf("enter your selete :\n");
- 202 printf("1.send english message.\n");
- 203 printf("2.call telephone\n");
- 204 printf("3.exit.\n");
- 205 choice = getchar();
- 206 switch(choice)
- 207 {
- 208 case '1': send_en_message(fd,info);
- 209 break;
- 210 case '2': call_telephone(fd);
- 211 break;
- 212 case '3': break;
- 213 default : break;
- 214 }
- 215 close(fd);
- 216 return 0;
- 217 }