关于gsm短信的长度会影响发送吗?

jackychao   2010-3-23 12:23 楼主
情况是这样的:
我一个在linux下跑的C程序 主要是完成GSM发短信的功能~~~
短信短一点的情况 可以成功发出去“HELLO WORLD”这样~~
长一点 就发布过去“fwefjweifjweofjwoiejfioewfjwoejfweo”就发不出去了~

但是我在minicom 下是可以发送出去很长的字符串的~~[/color]我的代码如下

#include
#include
#include
#include
#include
#include
#include "fcntl.h"


int init_device(int portfd)
{
        struct termios tty;
        tcgetattr(portfd,&tty); //get the info
       
        //串口参数:115200bps,8N1
        cfsetospeed(&tty,B115200);   //set out speed
        cfsetispeed(&tty,B115200);   //set in speed = 115200
        tty.c_cflag &= ~CSIZE;  //
        tty.c_cflag |= CS8;  // 控制模式:设置8
        tty.c_lflag &= ~(ICANON| ECHO| ECHOE); //
        tty.c_cflag |= CREAD;//
        tty.c_cflag &= ~(PARENB | CSTOPB);//
        tty.c_iflag |= IXON; //
        tty.c_iflag |= IXOFF; //
        tty.c_iflag |= IXANY;
        tty.c_cflag &= ~CRTSCTS; //
        tty.c_cc[VMIN] = 0; //只要读到数据,则read
        tty.c_cc[VTIME] = 10; //若定时器超期,却未读到数据,返回0
       
        tcsetattr(portfd, TCSANOW,&tty);
        return 0;
       
}
void Set_GSM(int portfd, int mod )//缺省模式是text
{
       
        int len;
        int n;
        char cmd[255];
       
       
        //
        tcflush(portfd, TCIOFLUSH);
        sprintf(cmd,"AT+CMGF=%d\r",mod);
        write(portfd,cmd,strlen(cmd));
        sleep(2);  //
       
        n=read(portfd,cmd,255);//
        cmd[n]='\0';
        printf("receive....:  %s",cmd);
       
        //设置GSM
       
        tcflush(portfd,TCIOFLUSH);
        //sprintf(cmd,"AT+CSCS= USC2\r");
        sprintf(cmd,"AT+CSCS= GSM\r");
        write(portfd,cmd,strlen(cmd));
        sleep(2);  //
       
        n=read(portfd,cmd,255);//
        cmd[n]='\0';
        printf("receive:  %s",cmd);
       
        //
        tcflush(portfd,TCIOFLUSH);
        sprintf(cmd,"AT+CSMP=17,168,0,0\r");
        write(portfd,cmd,strlen(cmd));
        sleep(2);  //
       
        n=read(portfd,cmd,255);//
        cmd[n]='\0';
        printf("receive:  %s",cmd);
       
        //
        tcflush(portfd,TCIOFLUSH);
        sprintf(cmd,"AT+CNMI=2,1,0,0,1\r");
        write(portfd,cmd,strlen(cmd));
        sleep(2);  //
       
        n=read(portfd,cmd,255);//
        cmd[n]='\0';
        printf("receive:  %s",cmd);
       
        //
        //tcflush(portfd,TCIOFLUSH);
        //sprintf(cmd,"AT+CSMP=17,168,0,0\r");
        //write(portfd,cmd,strlen(cmd));
        //sleep(2);  //
       
        //n=read(portfd,cmd,255);//
        //cmd[n]='\0';
        //printf("receive:  %s",cmd);
       
       
       
        //        return 1;
}

int Send_TextMod(int portfd, char phone[40], char message[255])
{
       
        printf("phone = %s,  portfd= %d, msg = %s\n\n",phone,portfd,message);
        int len, n;
        char cmd[255],msg[114];
        char ctrlZ=26;
        int mod = 1;
       
       
       
        //
        tcflush(portfd,TCIOFLUSH);
        sprintf(cmd,"AT+CMGS =%s\r",phone);
        write(portfd,cmd,strlen(cmd));
        sleep(2);
       
        n=read(portfd,cmd,255);//
        cmd[n]='\0';
        printf("receive:  %s\n",cmd);
       
        //发送msg
        strcat(message,"\x01a");
        write(portfd,message,strlen(message));
        sleep(5);
       
        n=read(portfd,cmd,255);//
        cmd[n]='\0';
        printf("receive:  %s",cmd);
       
        close(portfd);
       
        return 1;
}

int main(int argc, char ** argv)

{
        char devttyS[40];
        char phone[40];
        char message[255];
        int portfd;
        if(argc<4)
        {
                printf("usage: %s phone_num, dev_path, message...\n",argv[0]);
                return -1;
        }
        else
        {
                strcpy(phone,argv[1]);
                strcpy(devttyS,argv[2]);
                strcpy(message,argv[3]);
        }
       
       
        message[strlen(message)] = '\0';
        //
        portfd = open(devttyS,O_RDWR);
        printf("串口id :portfd = %d\n",portfd);
        init_device(portfd); //
       
        Set_GSM(portfd,1);
        Send_TextMod(portfd,phone,message);
        return 0;
}

回复评论 (4)

请各位大侠指教一下·~~
我用的模块是 TC35i  有时候 发短信也不稳定~~
点赞  2010-3-23 12:59
//发送msg
strcat(message,"\x01a");
write(portfd,message,strlen(message));
sleep(5);

n=read(portfd,cmd,255);//
cmd[n]='\0';
printf("receive: %s",cmd);
这个延时长点试试
点赞  2010-4-6 11:38
利用监控线检测一下,看看你的设备是不是已经把数据发了出来?
几下可能情况:
1、设备数据已经发出来了,但模块没有相应:
  查看发送出来的数据是否齐全(比如数据后面是不是多一个数据或者少一个数据)
  查看模块本身是否存在问题
2、设备数据已经发出来了,模块返回错误
   查看模块参数是不是正常(可以重启试试)
   查看模块中的SIM是否可靠工作(比如欠费、接触不良等等)
   查看短信内容长度是否超出范围
3、设备数据已经发出来了,但是数据不全
   检测设备发送缓冲区是否已经有数据(有可能缓冲区满了出新未知错误等等)
点赞  2010-4-6 11:46
话说里面的sleep参数是毫秒级的吗,时间是不是稍微短了点了吧?
另外,发送之后直接去接收肯定也是不稳妥的处理方法了
点赞  2010-4-7 09:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复