📄 main.c
字号:
/***********************************GSM发送短信实例步骤:1 打开串口;2 初始化串口参数;3 发送AT+CMGF命令,通知GSM模块采用PDU模式;4 构造PDU字符串,并利用AT+CMGS命令发送;5 发送结束,关闭串口。作者:蒙德鑫时间:2008/12/10************************************/#include <stdio.h> /*标准输入输出定义*/#include <stdlib.h> /*标准函数库定义*/#include <unistd.h> /*Unix标准函数定义*/#include <string.h>#include <sys/types.h> /**/#include <sys/stat.h> /**/#include <fcntl.h> /*文件控制定义*/#include <termios.h> /*PPSIX终端控制定义*/#include <errno.h> /*错误号定义*/#include "PDU.h" /* 构造PDU字符串 *//* 串口设备宏定义 */#define ttyS0 "/dev/ttyS0"#define ttyS1 "/dev/ttyS1"#define ttyUSB0 "/dev/ttyUSB0"#define ttyUSB1 "/dev/ttyUSB1"/* 中国北京移动短信中心号码 */#define CHINA_MOBILE_BEIJING_MSG_CENTER "8613800100500"/* 初始化串口参数 */void init_device(int portfd);int main(int argc,char *argv[]){ int portfd; char cmd[256]; char ctrlZ = 26; /* 以读写方式打开串口 */ char portdevice[256]; memset(portdevice,0,sizeof(portdevice)); strncpy(portdevice,ttyUSB0,strlen(ttyUSB0)); portfd = open(portdevice,O_RDWR); if(portfd == -1){//打开失败,则退出 printf("Can't Open Serial Port:%s\n",portdevice); return EXIT_FAILURE; } /* 初始化串口参数 */ init_device(portfd); /* 发送AT+CMGF命令,通知GSM模块采用PDU模式 */ memset(cmd,0,sizeof(cmd)); sprintf(cmd,"AT+CMGF=0\r"); sleep(1);//等待GSM模块命令处理完成 write(portfd,cmd,strlen(cmd));//发送AT+CMGF命令 sleep(1); /* 构造PDU字符串 */ char msg[] = "你好啊哈哈meng!"; char *phone = "8615120094301"; //char *phone = "8615120054270"; char pdu[256]; memset(pdu,0,sizeof(pdu)); int len; if(-1 == build_pdu(msg,phone,CHINA_MOBILE_BEIJING_MSG_CENTER,pdu,&len)){//构造PDU字符串失败,则退出 perror("Building pdu failed.\n"); return EXIT_FAILURE; } /* 利用AT+CMGS命令发送PDU字符串 */ memset(cmd,0,sizeof(cmd)); sprintf(cmd,"AT+CMGS=%d\r",len); write(portfd,cmd,strlen(cmd)); sleep(1); write(portfd,pdu,strlen(pdu)); write(portfd,&ctrlZ,1);//发送以Ctrl+Z为结束符 sleep(1); /* 发送结束,关闭串口 */ close(portfd); return EXIT_SUCCESS;}/* 初始化串口参数使用非规范方式(raw mode);设置波特率为B9600;采用软件流控制,不使用硬件流控制;传输数据时使用8位数据位和一位停止位(8N1);不使用奇偶校验;*/void init_device(int portfd){ struct termios tty; tcgetattr(portfd,&tty); /*串口参数:9600bps,使用非规范方式,采用软件流控制*/ //设置输入输出波特率为9600bps cfsetospeed(&tty,B9600); cfsetispeed(&tty,B9600); //使用非规范方式 tty.c_lflag &= ~(ICANON | ECHO | ECHOE); //采用软件流控制,不使用硬件流控制 tty.c_iflag |= (IXON | IXOFF | IXANY); tty.c_cflag &= ~CRTSCTS; /* 8N1,不使用奇偶校验 */ //传输数据时使用8位数据位 tty.c_cflag &= ~CSIZE; tty.c_cflag |= CS8; //一位停止位,不使用奇偶校验 tty.c_cflag &= ~(PARENB | CSTOPB); //忽略DCD信号,启用接收装置 tty.c_cflag |= (CLOCAL | CREAD); /* Minimum number of characters to read */ tty.c_cc[VMIN] = 0; /* Time to wait for data (tenths of seconds)*/ tty.c_cc[VTIME] = 10; /* 使设置立即生效 */ tcsetattr(portfd,TCSANOW,&tty);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -