关于AT指令和gprs发送短信 急啊
#include
#include
#include
#include
#include
#include
#include
#include
struct message_info
{
char phno[12];
char message[128];
};
/*******************************************************************
*函数tty_write是用来向串口写入数据,
*send_buff是要发送的字符串;
*******************************************************************/
void tty_write(int gprs_fd, char *send_buff, int len)
{
char buff[128];
memset(buff, 0, sizeof(buff));
strcpy(buff, send_buff);
write(gprs_fd, send_buff, len);
printf("%s\n", buff);
}
/********************************************************************
*函数tty_read是用来读取串口数据的,并且将读取的数据打印;
* *****************************************************************/
void tty_read(int gprs_fd)
{
char reply_buff[128];
memset(reply_buff, 0, sizeof(reply_buff));
read(gprs_fd, reply_buff, sizeof(reply_buff));
printf("%s\n",reply_buff);
}
void gprs_init_serial(int gprs_fd)
{
struct termios options;
tcgetattr(gprs_fd, &options); //获取当前串口参数初始值,并赋值给options;
options.c_cflag |= ( CLOCAL | CREAD );//c_cflag 为控制模式设置;
options.c_cflag &= ~CSIZE; //清空原有字符长度;
options.c_cflag &= ~CRTSCTS; //启用RTS/CTS(硬件);
options.c_cflag |= CS8; //设置字符长度掩码;
options.c_cflag &= ~CSTOPB; //停止位设置为一个;
options.c_iflag |= IGNPAR; //c_iflag 为输入模式设置;
options.c_oflag = 0; //c_oflag 为输出模式设置;
options.c_lflag = 0; //c_lflag 为局部模式设置;
cfsetispeed(&options, B115200); //设置当前串口的输入波特率为115200;
cfsetospeed(&options, B115200); //设置当前串口的输出波特率为115200;
tcsetattr(gprs_fd,TCSANOW,&options); //设置当前串口的参数,立即修改;
}
int call(int gprs_fd, struct message_info info)
{
char send_buff[128];
char reply_buff[128];
if(strlen(info.phno) != 11)//判断接收手机号码是否是11位;
{
printf("Wrong phone number!");
return -1;
}
memset(send_buff,0,sizeof(send_buff));
strcpy(send_buff, "at\r\n");
write(gprs_fd, send_buff,strlen(send_buff));//测试模块是否正常;
printf("%s\n",send_buff);
memset(reply_buff, 0, sizeof(reply_buff));
sleep(1);//由于处理AT指令要花费一定时间,所以需要睡眠1秒;
read(gprs_fd, reply_buff, sizeof(reply_buff));
printf("%s\n",reply_buff);
memset(send_buff, 0, sizeof(send_buff));
sprintf(send_buff, "ATD%s;\r\n", info.phno);
write(gprs_fd, send_buff, strlen(send_buff));//拨打电话;
printf("calling %s..................\n", send_buff);
memset(reply_buff, 0, sizeof(reply_buff));
sleep(100);
read(gprs_fd, reply_buff, sizeof(reply_buff));
printf("%s\n",reply_buff);
return 0;
}
/*************************************************************
*函数swap用来奇偶交换;
*number为原有字符,swap为交换后的字符;
**************************************************************/
void swap(char *number, char *swap)
{
char ch[] = "86";
char tmp[16];
int i;
memset(swap, 0, 32);
memset(tmp, 0, 16);
strcpy(swap, number);
strcat(swap, "f");
strcat(ch, swap);
strcpy(swap, ch);
for(i = 0;i<=strlen(swap) - 1;i += 2)
{
tmp[i + 1] = swap[i];
tmp[i] = swap[i + 1];
}
strcpy(swap, tmp);
}
int hang_phone(int gprs_fd)
{
//char send_buff[128];
//char reply_buff[128];
printf("Hang Up!\n");//提示电话将被挂断;
/*memset(send_buff, 0, sizeof(send_buff));
strcpy(send_buff, "AT\r\n");
write(gprs_fd, send_buff, strlen(send_buff));
printf("%s\n",send_buff);
*/
tty_write(gprs_fd, "AT\r\n", strlen("AT\r\n"));
sleep(1);
tty_read(gprs_fd);
tty_write(gprs_fd, "ATH\r\n",strlen("ATH\r\n"));//挂断电话;
sleep(30);//模块响应;
tty_read(gprs_fd);
return 0;
}
void answer_phone(int gprs_fd)
{
printf("Answer!\n");
tty_write(gprs_fd, "AT\r\n", strlen("AT\r\n"));
sleep(1);
tty_read(gprs_fd);
tty_write(gprs_fd, "ATA\r\n",strlen("ATA\r\n"));//接听电话;
sleep(30);//模块响应;
tty_read(gprs_fd);
}
void send_message(int gprs_fd, struct message_info info, int flag)
{
char send_buff[128];
printf("Send english message!\n");
tty_write(gprs_fd, "AT\r\n", strlen("AT\r\n"));
sleep(1);
tty_read(gprs_fd);
if(flag == 0)
{
tty_write(gprs_fd, "AT+CSMP=17,167,0,0\r\n",strlen("AT+CSMP=17,167,0,0\r\n"));
sleep(1);
tty_read(gprs_fd);