情况是这样的:
我一个在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;
}
请各位大侠指教一下·~~
我用的模块是 TC35i 有时候 发短信也不稳定~~
//发送msg
strcat(message,"\x01a");
write(portfd,message,strlen(message));
sleep(5);
n=read(portfd,cmd,255);//
cmd[n]='\0';
printf("receive: %s",cmd);
这个延时长点试试
利用监控线检测一下,看看你的设备是不是已经把数据发了出来?
几下可能情况:
1、设备数据已经发出来了,但模块没有相应:
查看发送出来的数据是否齐全(比如数据后面是不是多一个数据或者少一个数据)
查看模块本身是否存在问题
2、设备数据已经发出来了,模块返回错误
查看模块参数是不是正常(可以重启试试)
查看模块中的SIM是否可靠工作(比如欠费、接触不良等等)
查看短信内容长度是否超出范围
3、设备数据已经发出来了,但是数据不全
检测设备发送缓冲区是否已经有数据(有可能缓冲区满了出新未知错误等等)
话说里面的sleep参数是毫秒级的吗,时间是不是稍微短了点了吧?
另外,发送之后直接去接收肯定也是不稳妥的处理方法了