天嵌 ARM开发社区

 找回密码
 注册
查看: 3632|回复: 8

QT下做的GSM通信

[复制链接]
翔鹰科技 发表于 2012-4-17 21:01:00 | 显示全部楼层 |阅读模式
       以下是我使用TQ2440板子基于QT2.0完成的GSM收发短信代码,能实现收发短信,但是偶尔会有发送不成功,或者是发送成功了但是接收到的短信不是发送的内容,还有就是进入短信读取程序时,按照设定,如果没有短信可读取,那么会退出短信读取程序,可是有时候能非常顺利的解读出收到的短信内容然后跳出,有时候就死机,跳不出来,同样,如果在指定的时间内没将短信发送出去会提示发送失败,实际运行时发现有时候明明超过了指定的时间却没跳出来,出现死机,这些都是怎么一回事呢,请各路高手支支招啊,板子使用串口二,已经接了232芯片:


/*变量定义部分*/
static int fdgsm;
static int fdfmq;
static int i;
static char ctrlz=26;
static char cr=13;
static unsigned char  num=0;
static unsigned  char  AT[]={"AT"};
static  char  ATCMGS[]={"AT+CMGS="};
static  char  ATCMGR[]={"AT+CMGR=1"};
static  char  ATCMGD[]={"AT+CMGD=1"};
static  char  telephonenum[11];
static char   numtable[]={"0123456789"};
static  char  BUF[]={"DW"};

static unsigned char  nnumtable[]={" "};

static  char  CMGR[80];
static  char  data[24];

/*打开设备部分*/
fdgsm=open("/dev/tq2440_serial2",O_RDWR);
if(fdgsm<0)
{
    printf("open GSM failed. \r\n");
}
else
    printf("open GSM successed. \r\n");

fdfmq=open("/dev/fmq",O_RDWR);
if(fdfmq<0)
{
    printf("open FMQ failed. \r\n");
}
else
    printf("open FMQ successed. \r\n");

/*短信发送部分*/
void Location::GO_slot()
{       
        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}

        while(write(fdgsm,AT,2)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
        while(1)
        {
                read(fdgsm,CMGR,sizeof(CMGR));
                if(CMGR[0]=='O'&&CMGR[1]=='K')
                {
                        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}
                        break;
                }
        }
        printf("writer AT finish!\r\n");

        while(write(fdgsm,ATCMGS,8)!=-1){break;}
        while(write(fdgsm,telephonenum,11)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
        usleep(1000);
        usleep(8000);
        usleep(8000);
        usleep(8000);

        printf("writer ATCMGS finish!\r\n");
       

        while(write(fdgsm,BUF,2)!=-1){break;}
        printf("writer BUF finish!\r\n");

        while(write(fdgsm,&ctrlz,1)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
        printf("send finish!\r\n");

        while(1)
        {
                read(fdgsm,CMGR,80);
                if(CMGR[0]=='+'&&CMGR[1]=='C'&&CMGR[2]=='M'&&CMGR[3]=='G'&&CMGR[4]=='S')
                {
                        while(write(fdgsm,ATCMGD,9)!=-1){break;}
                        while(write(fdgsm,&cr,1)!=-1){break;}
                        ioctl(fdfmq,1,1);
                        ioctl(fdfmq,0,1);
                        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}
                        jingduLineEdit->setText(tr("send ok!"));
                        weiduLineEdit->setText(tr("send ok!"));
                }

                if(CMGR[0]=='E'&&CMGR[1]=='R'&&CMGR[2]=='R'&&CMGR[3]=='O'&&CMGR[4]=='R')
                {
                        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}
                        jingduLineEdit->setText(tr("send fail!"));
                        weiduLineEdit->setText(tr("send fail!"));
                        break;
                }

                if(CMGR[8]=='S'&&CMGR[9]=='M'&&CMGR[12]=='1')
                {
                        ioctl(fdfmq,1,1);
                        ioctl(fdfmq,0,1);
                        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}
                        jingduLineEdit->setText(tr("read now!"));
                        weiduLineEdit->setText(tr("read now!"));
                        break;
                }
        }
}

/*短信解读部分*/
void Location::read_slot()
{
        int n;

        QString strlength;
        QString weistrlength;
        QString jingstrlength;

        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}

        write(fdgsm,ATCMGR,9);
        write(fdgsm,&cr,1);
        while(1)
        {
                n=read(fdgsm,CMGR,80);
                printf("rcvnum:%d\n",n);
                for(i=0;i<n;i++){printf("CMGR:%c\n",CMGR[i]);}

                if((CMGR[10]=='N'&&CMGR[23]=='E')||(CMGR[10]=='S'&&CMGR[23]=='W'))
                {
                        for(i=0;i<24;i++){data[i]=CMGR[i];}

                        ioctl(fdfmq,1,1);
                        ioctl(fdfmq,0,1);

                        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}

                        break;
                }

                if(CMGR[1]=='C'&&CMGR[2]=='M'&&CMGR[3]=='G'&&CMGR[4]=='R'&&CMGR[7]=='0'&&CMGR[10]=='0')
                {
                        jingduLineEdit->setText(tr("no data!"));
                        weiduLineEdit->setText(tr("no data!"));
                        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}
                        for(i=0;i<24;i++){data[i]=nnumtable[0];}
                        break;
                }
        }

        for(i=0;i<80;i++){CMGR[i]=nnumtable[0];}

        weistrlength=QString(data).mid(0,11);
        weiduLineEdit->setText(weistrlength);
        weiduLineEdit->show();

        jingstrlength=QString(data).mid(12,12);
        jingduLineEdit->setText(jingstrlength);
        jingduLineEdit->show();

        while(write(fdgsm,ATCMGD,9)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
}

如果想交流这方面的,可以联系本人,QQ907715200
TQ_guoxixiao 发表于 2012-4-19 18:13:19 | 显示全部楼层
有时候是跟打电话模块有关的,或者手机卡的问题。
 楼主| 翔鹰科技 发表于 2012-4-20 10:51:17 | 显示全部楼层
解决了问题,漏了几行判断的代码:)
陈世超 发表于 2012-4-22 13:38:46 | 显示全部楼层
本帖最后由 陈世超 于 2012-4-22 13:38 编辑

把代码可以贴出来吗?谢谢了
 楼主| 翔鹰科技 发表于 2012-4-22 20:14:57 | 显示全部楼层
/*短信发送*/
void Location::GO_slot()
{       
        int t=0;
        int nread;

        memset(CMGR,0,sizeof(CMGR));//clear CMGR

        while(write(fdgsm,AT,2)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
        sleep(1);
        while(1)
        {
                sleep(1);
                nread=read(fdgsm,CMGR,sizeof(CMGR));
                printf("nread:%d\n",nread);
                for(i=0;i<nread;i++){printf("ATCMGS:%c\n",CMGR[i]);}
                if(CMGR[0]=='O'&&CMGR[1]=='K')
                {       
                        memset(CMGR,0,sizeof(CMGR));
                        break;
                }
                else
                {
                        write(fdgsm,AT,2);
                        write(fdgsm,&cr,1);
                }
        }
        printf("writer AT finish!\r\n");

        while(write(fdgsm,ATCSCA,22)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
        sleep(1);
        while(1)
        {
                sleep(1);
                nread=read(fdgsm,CMGR,sizeof(CMGR));
                printf("nread:%d\n",nread);
                for(i=0;i<nread;i++){printf("ATCMGS:%c\n",CMGR[i]);}
                if(CMGR[0]=='O'&&CMGR[1]=='K')
                {       
                        memset(CMGR,0,sizeof(CMGR));
                        break;
                }
                else
                {
                        write(fdgsm,ATCSCA,22);
                        write(fdgsm,&cr,1);
                }
        }
        printf("writer ATCSCA finish!\r\n");

        while(write(fdgsm,ATCMGS,8)!=-1){break;}
        while(write(fdgsm,telephonenum,11)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
        usleep(1000);
        usleep(8000);
        usleep(8000);
        usleep(8000);

        printf("writer ATCMGS finish!\r\n");
       

        while(write(fdgsm,BUF,2)!=-1){break;}
        printf("writer BUF finish!\r\n");

        while(write(fdgsm,&ctrlz,1)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
        sleep(1);
        printf("send finish!\r\n");

        while(1)
        {
                if(nread=read(fdgsm,CMGR,80)>0){printf("rcv data\n");}
                usleep(5000);
                if(CMGR[0]=='+'&&CMGR[1]=='C'&&CMGR[2]=='M'&&CMGR[3]=='G'&&CMGR[4]=='S')
                {
                        t=0;
                        while(write(fdgsm,ATCMGD,9)!=-1){break;}
                        while(write(fdgsm,&cr,1)!=-1){break;}
                        ioctl(fdfmq,1,1);
                        ioctl(fdfmq,0,1);
                        memset(CMGR,0,sizeof(CMGR));
                        jingduLineEdit->setText(tr("send ok!"));
                        weiduLineEdit->setText(tr("send ok!"));
                        while(1)
                        {
                                read(fdgsm,CMGR,80);
                                sleep(1);
                               
                                if(CMGR[8]=='S'&&CMGR[9]=='M'&&CMGR[12]=='1')
                                {
                                        ioctl(fdfmq,1,1);
                                        ioctl(fdfmq,0,1);
                                        memset(CMGR,0,sizeof(CMGR));
                                        jingduLineEdit->setText(tr("read now!"));
                                        weiduLineEdit->setText(tr("read now!"));
                                        break;
                                }
                                else
                                {
                                        printf("wait new msg......\n");
                                        jingduLineEdit->setText(tr("wait new msg......"));
                                        weiduLineEdit->setText(tr("wait new msg......"));
                                        memset(CMGR,0,sizeof(CMGR));
                                        t++;
                                        if(t==60)//out recv timer !!
                                        {
                                                printf("wait time out !\n");
                                                t=0;
                                                jingduLineEdit->setText(tr("no rcv msg !"));
                                                weiduLineEdit->setText(tr("no rcv msg !"));

                                                break;
                                        }
                                }
                        }
                        break;
                }

                else
                {
                        printf("sending......\n");
                        jingduLineEdit->setText(tr("sending......"));
                        weiduLineEdit->setText(tr("sending......"));
                        memset(CMGR,0,sizeof(CMGR));
                        t++;
                        if(t==640)//out send  timer !!
                        {
                                printf("send time out !\n");
                                t=0;
                                jingduLineEdit->setText(tr("send fail !"));
                                weiduLineEdit->setText(tr("send fail !"));

                                break;
                        }
                }
        }
}

/*短信解析*/
void Location::read_slot()
{
        int n;

        QString strlength;
        QString weistrlength;
        QString jingstrlength;

        bzero(CMGR,sizeof(CMGR));//clear CMGR
        bzero(data,sizeof(data));

        while(1)
        {
                write(fdgsm,ATCMGR,9);
                write(fdgsm,&cr,1);
                sleep(1);

                n=read(fdgsm,CMGR,80);
                printf("rcvnum:%d\n",n);
                for(i=0;i<n;i++){printf("CMGR:%c\n",CMGR[i]);}

                if((CMGR[10]=='N'&&CMGR[23]=='E')||(CMGR[10]=='S'&&CMGR[23]=='W'))
                {
                        for(i=0;i<24;i++){data[i]=CMGR[i];}

                        ioctl(fdfmq,1,1);
                        ioctl(fdfmq,0,1);

                        bzero(CMGR,sizeof(CMGR));//clear CMGR

                        break;
                }

                else if(CMGR[1]=='C'&&CMGR[2]=='M'&&CMGR[3]=='G'&&CMGR[4]=='R'&&CMGR[7]=='0'&&CMGR[10]=='0')
                {
                        jingduLineEdit->setText(tr("no data!"));
                        weiduLineEdit->setText(tr("no data!"));
                        bzero(CMGR,sizeof(CMGR));//clear CMGR
                        bzero(data,sizeof(data));
                        break;
                }
                else
               
                bzero(CMGR,sizeof(CMGR));//clear CMGR
        }

        bzero(CMGR,sizeof(CMGR));//clear CMGR

        weistrlength=QString(data).mid(0,11);
        weiduLineEdit->setText(weistrlength);
        weiduLineEdit->show();

        jingstrlength=QString(data).mid(12,12);
        jingduLineEdit->setText(jingstrlength);
        jingduLineEdit->show();

        bzero(CMGR,sizeof(CMGR));//clear CMGR

        while(write(fdgsm,ATCMGD,9)!=-1){break;}
        while(write(fdgsm,&cr,1)!=-1){break;}
}

评分

参与人数 1 +10 收起 理由
liyvhg + 10 很给力!

查看全部评分

axlrose 发表于 2012-4-23 14:08:21 | 显示全部楼层
本帖最后由 axlrose 于 2012-4-23 14:09 编辑

  http://developer.berlios.de/projects/gsmmux/这个库实现多路复用功能,有没有用过的?
使用虚拟终端模拟成多个gsm接口
 楼主| 翔鹰科技 发表于 2012-4-23 20:55:41 | 显示全部楼层
axlrose 发表于 2012-4-23 14:08
http://developer.berlios.de/projects/gsmmux/这个库实现多路复用功能,有没有用过的?
使用虚拟终端模 ...

没用过,那个好用?
axlrose 发表于 2012-4-26 13:25:37 | 显示全部楼层
翔鹰科技 发表于 2012-4-23 20:55
没用过,那个好用?

等空闲点的时候再用,只用在linux下跑了一下,虚拟出了几个终端发送AT是正常的,给人假像就是好像有几个gprs设备,还没试ppp
anak 发表于 2012-8-10 14:08:06 | 显示全部楼层
我最近也要在板子上做一个基于linux的GSM短信功能,不知道LZ用的GSM是什么呢?能否介绍一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-4 14:17 , Processed in 1.046882 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表