linux下编程实现GPRS模块短信的收发和删除

        这几天搞GPRS模块,虽然花费了些时间,但是也收获了很多,从开始连GPRS模块主要干啥都不清楚,一点一点的查找、学习。前面学习了通过串口用AT命令实现了短信的收发和删除。这几天通过学习linux高级编程那本书和学习别人的文章、博客,先是学习linux下串口编程,然后编程实现GPRS模块短信的收发和删除操作,为了调试这几天不知道用我的手机卡发了多少短信,不过总算搞定。

下面是实现代码:

/*********************************************************************************
 *      Copyright:  (C) 2014 liu chengdeng<1037398771@qq.com> 
 *                  All rights reserved.
 *
 *       Filename:  my_msm_test.c
 *    Description:  This file 
 *                 
 *        Version:  0.0.0(08/31/2014~)
 *         Author:  liuchengdeng <1037398771@qq.com>
 *      ChangeLog:  1, Release initial version on "08/31/2014 05:07:59 PM"
 *                 
 ********************************************************************************/
#include     <string.h>
#include     <stdio.h>     
#include     <stdlib.h>     
#include     <unistd.h>     
#include     <sys/types.h>  
#include     <sys/stat.h>   
#include     <fcntl.h>      
#include     <termios.h>    
#include     <errno.h>     


struct message_info
{
    char cnnu[20];
    char phnu[20];
    char message[128];
};


void serial_init(int fd)
{
    struct termios options;
    tcgetattr(fd, &options);
    options.c_cflag &= ~CSTOPB;
    options.c_iflag = IGNPAR;
    options.c_oflag = 0;
    options.c_lflag = 0;


    cfsetispeed(&options, B115200);
    cfsetospeed(&options, B115200);
    tcsetattr(fd,TCSANOW,&options);
}


int OpenDev(char *Dev)
{
    int fd = open( Dev, O_RDWR | O_NOCTTY | O_NDELAY );          
    if (-1 == fd)   
    {           
        perror("Can't Open Serial Port !");
        return -1;      
    }   
    else    
    return fd;
}


int send(int fd,char *cmgf,char *cmgs,char *message)
{
    int  nread,nwrite;
    char buff[128];
    char reply[128];


    memset(buff,0,sizeof(buff));
    strcpy(buff,"at\r");
    nwrite = write(fd,buff,strlen(buff));
    printf("nwrite=%d,%s\n",nwrite,buff);


    memset(reply,0,sizeof(reply));
    sleep(1);
    nread = read(fd,reply,sizeof(reply));
    printf("nread=%d,%s\n",nread,reply);


    memset(buff,0,sizeof(buff));
    strcpy(buff,"AT+CMGF=");
    strcat(buff,cmgf);
    strcat(buff,"\r");
    nwrite = write(fd,buff,strlen(buff));
    printf("nwrite=%d,%s\n",nwrite,buff);
    
    memset(reply,0,sizeof(reply));
    sleep(1);
    nread = read(fd,reply,sizeof(reply));
    printf("nread=%d,%s\n",nread,reply);


    memset(buff,0,sizeof(buff));
    strcpy(buff,"AT+CMGS=");
    strcat(buff,"\"");
    strcat(buff,cmgs);
    strcat(buff,"\"");
    strcat(buff,"\r");
    nwrite = write(fd,buff,strlen(buff));
    printf("nwrite=%d,%s\n",nwrite,buff);


    memset(reply,0,sizeof(reply));
    sleep(1);
    nread = read(fd,reply,sizeof(reply));
    printf("nread=%d,%s\n",nread,reply);


    memset(buff,0,sizeof(buff));
    strcpy(buff,message);
    nwrite = write(fd,buff,strlen(buff));
    printf("nwrite=%d,%s\n",nwrite,buff);
    
    memset(reply,0,sizeof(reply));
    sleep(1);
    sleep(1);
    sleep(1);
    sleep(1);
    nread = read(fd,reply,sizeof(reply));
    printf("nread=%d,%s\n",nread,reply);
}


int send_en_message(int fd,struct message_info info)
{
    char cmgf[] = "1";
    int  conter = 0;
    char cmgs[16] = {'\0'};


    printf("please input the  recever phone number :\n");
    scanf("%s",&info.phnu);
    while(strlen(info.phnu) != 11)
    {
        if(conter >= 3)
        {
            printf("conter out !\n");
            return -1;
        }
        printf("number shuld be 11 bits,enter agin :\n");
        scanf("%s",info.phnu);
        conter ++;
    }


    printf("please input you message :\n");
    scanf("%s",&info.message);
    strcat(info.message,"\x1a");
    strcat(cmgs,info.phnu);


    send(fd,cmgf,cmgs,info.message);
}


int read_en_message(int fd) 
{
        int  snum;
        char num[]="0";
        int  nread,nwrite;
        char buff[512];
        char reply[512];


        memset(buff,0,sizeof(buff));
        strcpy(buff,"at\r");
        nwrite = write(fd,buff,strlen(buff));
        printf("nwrite=%d,%s\n",nwrite,buff);


        memset(reply,0,sizeof(reply));
        sleep(1);
        nread = read(fd,reply,sizeof(reply));
        printf("nread=%d,%s\n",nread,reply);


        memset(buff,0,sizeof(buff));
        strcpy(buff,"AT+CMGF=1");
        strcat(buff,"\r");
        nwrite = write(fd,buff,strlen(buff));
        printf("nwrite=%d,%s\n",nwrite,buff);


        memset(reply,0,sizeof(reply));
        sleep(1);
        nread = read(fd,reply,sizeof(reply));
        printf("nread=%d,%s\n",nread,reply);
        
        memset(buff,0,sizeof(buff));
        strcpy(buff,"AT+CSCS=\"GSM\"");
        strcat(buff,"\r");
        nwrite = write(fd,buff,strlen(buff));
        printf("nwrite=%d,%s\n",nwrite,buff);


        memset(reply,0,sizeof(reply));
        sleep(1);
        nread = read(fd,reply,sizeof(reply));
        printf("nread=%d,%s\n",nread,reply);


        printf("just read  unread--message  please  input 1:\n");
        printf("if you read just one message please input 2:\n");
        printf("if you read all the  message please input 3:\n");
        printf("input the number what you want to do :");
        scanf("%d",&snum);
        
        while(!((snum==1)||(snum==2)||(snum==3)))
        {
            printf("input error ,please again:");
            scanf("%d",&snum);
        }
        
        if(snum==1)
        {
            memset(buff,0,sizeof(buff));
            strcpy(buff,"AT+CMGL=\"UNREAD\"");
            strcat(buff,"\r");
            nwrite = write(fd,buff,strlen(buff));
            printf("nwrite=%d,%s\n",nwrite,buff);


            memset(reply,0,sizeof(reply));
            sleep(1);
            sleep(1);
            nread = read(fd,reply,sizeof(reply));
            printf("nread=%d,%s\n",nread,reply);
        }
        else if(snum==2)
        {   
            printf("please input the number you want to read:");
            scanf("%s",&num);
            memset(buff,0,sizeof(buff));
            strcpy(buff,"AT+CMGR=");
            strcat(buff,num);
            strcat(buff,"\r");
            nwrite = write(fd,buff,strlen(buff));
            printf("nwrite=%d,%s\n",nwrite,buff);


            memset(reply,0,sizeof(reply));
            sleep(1);
            nread = read(fd,reply,sizeof(reply));
            printf("nread=%d,%s\n",nread,reply);
        }


        else 
        {
            memset(buff,0,sizeof(buff));
            strcpy(buff,"AT+CMGL=\"ALL\"");
            strcat(buff,"\r");
            nwrite = write(fd,buff,strlen(buff));
            printf("nwrite=%d,%s\n",nwrite,buff);


            memset(reply,0,sizeof(reply));
            sleep(1);
            sleep(1);
            sleep(1);
            nread = read(fd,reply,sizeof(reply));
            printf("nread=%d,%s\n",nread,reply);
        }


        return 0;
}


int delete_en_message(int fd)
{
        int  nread,nwrite;
        char num[]="0";
        char buff[128];
        char reply[128];


        memset(buff,0,sizeof(buff));
        strcpy(buff,"at\r");
        nwrite = write(fd,buff,strlen(buff));
        printf("nwrite=%d,%s\n",nwrite,buff);


        memset(reply,0,sizeof(reply));
        sleep(1);
        nread = read(fd,reply,sizeof(reply));
        printf("nread=%d,%s\n",nread,reply);
        
        printf("please input the number you want to delete:");
        scanf("%s",&num);
        memset(buff,0,sizeof(buff));
        strcpy(buff,"AT+CMGD=");
        strcat(buff,num);
        strcat(buff,"\r");
        nwrite = write(fd,buff,strlen(buff));
        printf("nwrite=%d,%s\n",nwrite,buff);


        memset(reply,0,sizeof(reply));
        sleep(1);
        nread = read(fd,reply,sizeof(reply));
        printf("nread=%d,%s\n",nread,reply); 
}






int main(int argc, char **argv)
{
    int fd,select;
    int nread,nwrite;
    struct message_info info;
    char buff[256];
    char reply[256];
    char *dev  = "/dev/ttyS1"; //鎴戠殑鏄覆鍙d簩
    
    fd = OpenDev(dev);
    serial_init(fd);
    
    printf("this just be used to send English message\n");
    printf("0.exit.\n");
    printf("1.send   message.\n");
    printf("2.read   message.\n");
    printf("3.delete message.\n");
    printf("enter your selete :\n");
    
    select = getchar();
    switch(select)
    {
        case '1': send_en_message(fd,info);
                break;
        case '2': read_en_message(fd); 
                break;
        case '3': delete_en_message(fd);
                break;
        case '0': break;
                default : break;
    }


    close(fd);
    return 0;
}

以下是部分测试过程:


[root@root /]# ./my_msm_test 
this just be used to send English message
0.exit.
1.send   message.
2.read   message.
3.delete message.
enter your selete :
2
nwrite=3,at
nread=9,at

OK

nwrite=10,AT+CMGF=1
nread=16,AT+CMGF=1

OK

nwrite=14,AT+CSCS="GSM"
nread=20,AT+CSCS="GSM"
OK

just read  unread--message  please  input 1:
if you read just one message please input 2:
if you read all the  message please input 3:
input  what you want to do :
3
nwrite=14,AT+CMGL="ALL"
nread=512,AT+CMGL="ALL"

+CMGL: 1,"REC READ","+8613260579256","","14/09/01,10:26:39+32"


xxxxx


+CMGL: 2,"REC READ","+8613260579256","","14/09/01,16:04:51+32"


hello world

+CMGL: 3,"REC READ","+8613260579256","","14/09/01,16:07:58+32"


+CMGL: 4,"REC READ","+8613260579256","","14/09/01,16:08:26+32"


+CMGL: 5,"REC READ","+8613260579256","","14/09/01,16:10:49+32"

+CMGL: 6,"REC READ","+8613260579256","","14/09/01,13:32:12+32"


ni hao
+CMGL: 7,"REC READ","+8613260579256","","14/09/01,13:33:08+32"
AT+CMGL="ALL"

[root@root /]# ./my_msm_test 
this just be used to send English message
0.exit.
1.send   message.
2.read   message.
3.delete message.
enter your selete :
2
nwrite=3,at
nread=9,at
OK

nwrite=10,AT+CMGF=1
nread=16,AT+CMGF=1

OK

nwrite=14,AT+CSCS="GSM"
nread=20,AT+CSCS="GSM"

OK
just read  unread--message  please  input 1:
if you read just one message please input 2:
if you read all the  message please input 3:
input  what you want to do :
2
please input the number you want to read:6
nwrite=10,AT+CMGR=6
nread=88,AT+CMGR=6

+CMGR: "REC READ","+8613260579256","","14/09/01,13:32:12+32"

ni hao
OK

[root@root /]# ./my_msm_test 
this just be used to send English message
0.exit.
1.send   message.
2.read   message.
3.delete message.
enter your selete :
3
nwrite=3,at
nread=9,at
OK

please input the number you want to delete:8
nwrite=10,AT+CMGD=8
nread=16,AT+CMGD=8
OK


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值