pc通过c语言发送at指令,关于AT指令跟gprs发送短信 急

本文介绍了如何使用AT指令与GPRS功能通过C语言实现短信发送,包括串口初始化、数据通信、拨号与短信内容处理。涉及函数如tty_write、tty_read和call,展示了从设置串口参数到发送英文短信的完整过程。
摘要由CSDN通过智能技术生成

关于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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值