深入浅出VC++串口编程之短信应用开发
发布时间:2006-02-21 16:00:43 来源:天极开发 网友评论 0 条 下面是对本例程软件的主要数据结构和核心函数的介绍:
数据结构
| // 用户信息编码方式 #define GSM_7BIT 0 #define GSM_8BIT 4 #define GSM_UCS2 8 // 短消息参数结构,编码/解码共用 // 其中,字符串以0结尾 typedef struct { char SCA[16]; // 短消息服务中心号码(SMSC地址) char TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA) char TP_PID; // 用户信息协议标识(TP-PID) char TP_DCS; // 用户信息编码方式(TP-DCS) char TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到 char TP_UD[161]; // 原始用户信息(编码前或解码后的TP-UD) char index; // 短消息序号,在读取时用到 } SM_PARAM; |
发送短消息
发送按钮对应的函数为CSMSControlDlg::OnSendButton,它读取用户输出并根据目标电话号码和短信息内容形成SM_PARAM(源PDU参数)的内容,接着进行发送:
| void CSMSControlDlg::OnSendButton() { // TODO: Add your control notification handler code here //获得用户输入 CString desPhoneNum; CString smsContent; GetDlgItemText(IDC_PHONENUM_EDIT,desPhoneNum); GetDlgItemText(IDC_SMSCONTENT_EDIT,smsContent); //填充SM_PARAM结构体内容 SM_PARAM smParam; smParam = CreateSMPARAMStruct(desPhoneNum,smsContent); //发送短信息 gsmSendMessage(smParam); } |
其中调用的gsmSendMessage函数体现了串口通信的核心内容,它按照第1节阐述的GSM模块发送短消息的串口控制流程进行短信的发送:
| BOOL gsmSendMessage(const SM_PARAM *pSrc // pSrc: 源PDU参数指针) { int nPduLength; // PDU串长度 unsigned char nSmscLength; // SMSC串长度 int nLength; // 串口收到的数据长度 char cmd[16]; // 命令串 char pdu[512]; // PDU串 char ans[128]; // 应答串 nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串 strcat(pdu, "/x01a"); // 以Ctrl-Z结束 gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度 nSmscLength++; // 加上长度字节本身 // 命令中的长度,不包括SMSC信息长度,以数据字节计 sprintf(cmd, "AT+CMGS=%d/r", nPduLength / 2-nSmscLength); // 生成命令 WriteComm(cmd, strlen(cmd)); // 先输出命令串 nLength = ReadComm(ans, 128); // 读应答数据 // 根据能否找到"/r/n> "决定成功与否 if (nLength == 4 && strncmp(ans, "/r/n> ", 4) == 0) { WriteComm(pdu, strlen(pdu)); // 得到肯定回答,继续输出PDU串 nLength = ReadComm(ans, 128); // 读应答数据 // 根据能否找到"+CMS ERROR"决定成功与否 if (nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0) { return TRUE; } } return FALSE; } |
读取短消息
点击"接收"按钮会通过gsmReadMessage函数的调用获得所有短消息,最后在列表控件中显示所有短信:
| void CSMSControlDlg::OnRecvButton() { // TODO: Add your control notification handler code here SM_PARAM smParam[100];//短信缓冲区 int smsNum;//短信条数 smsNum = gsmReadMessage(smParam);//读取短信 //显示短信 for(int i=0;i<smsNum;i++) { m_recvlist.AddString(CString(smsNum[i].TPA)+smsNum[i].TP_UD); } } |
其中调用的gsmReadMessage函数完成最核心的短信接收功能,它按照第1节阐述的GSM模块接收短消息的串口控制流程进行短信的接收:
// 参数:pMsg 短消息缓冲区,必须足够大 // 返回:短消息条数 int gsmReadMessage(SM_PARAM* pMsg) { int nLength; // 串口收到的数据长度 int nMsg; // 短消息计数值 char* ptr; // 内部用的数据指针 char cmd[16]; // 命令串 char ans[1024]; // 应答串 nMsg = 0; ptr = ans; sprintf(cmd, "AT+CMGL/r"); // 生成命令,用+CMGL可一次性读出全部短消息 WriteComm(cmd, strlen(cmd)); // 输出命令串 nLength = ReadComm(ans, 1024); // 读应答数据 // 根据能否找到"+CMS ERROR"决定成功与否 if(nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0) { // 循环读取每一条短消息, 以"+CMGL:"开头 while((ptr = strstr(ptr, "+CMGL:")) != NULL) { ptr += 6; // 跳过"+CMGL:" sscanf(ptr, "%d", &pMsg->index); // 读取序号 ptr = strstr(ptr, "/r/n"); // 找下一行 ptr += 2; // 跳过"/r/n" gsmDecodePdu(ptr, pMsg); // PDU串解码 pMsg++; // 准备读下一条短消息 nMsg++; // 短消息计数加1 } } return nMsg; } |
- 推荐阅讯
- 用Visual C++实现QQ界面的模拟
- Visual C# 2005快速入门之运用作用域
- VC中对鼠标的确定及简单控制
- Visual C++程序设计中的API和SDK
- 用Visual C++实现PDF文件的显示
- 利用VC++实现AVI文件的合成和分解
- Visual C++ 2005图像编程之属性设置栏
- Visual C#泛型学习之泛型介绍
- VC++实现工具栏上添加平面组合框控件
- 利用Visual C++设置桌面墙纸
- 阅读排行
- 1.VC++编程实现广告窗口自动关闭
- 2.深入浅出VC++串口编程之基于控件
- 3.解读VC++编程中的文件操作API和CFile类
- 4.利用Visual C#实现ICMP网络协议
- 5.深入浅出VC++串口编程之第三方类
- 6.掀起你的盖头来——谈VC++对象模型
- 7.Visual C#中用WMI控制远程计算机
- 8.深入浅出VC++串口编程之基于Win32 API
- 9.Visual C++2005中开发自定义绘图控件
- 10.深入浅出VC++串口编程之基本概念
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
