1. 程式人生 > >linux c語言使用sim900打電話發簡訊

linux c語言使用sim900打電話發簡訊

===================================================

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 }