📄 atcmd.cpp
字号:
// ATCmd.cpp: implementation of the CATCmd class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GSM_Ctrl_Prj.h"
#include "ATCmd.h"
#include "afxmt.h"
#include "Sms.h"
#include "SerialThread.h"
extern SerialThread* g_pSerialProcess;
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
TBYTE CATCmd::m_pdu[512];
CATCmd::CATCmd()
{
}
CATCmd::~CATCmd()
{
}
bool CATCmd::AT_Test(){
BYTE pByte[4];
pByte[0] = 'A';
pByte[1] = 'T';
pByte[2] = '\r';
pByte[3] = '\n';
g_pSerialProcess->WriteCmd(pByte,4);
//g_pSerialProcess->ResumeThread();
return true;
}
bool CATCmd::AT_Set_PDU(){
BYTE pByte[20] ;
memcpy(pByte , "AT+CMGF=0\r\n" , 11);
g_pSerialProcess->WriteCmd(pByte,11);
//g_pSerialProcess->ResumeThread();
return true;
}
bool CATCmd::AT_Set_Snfs(){
BYTE pByte[20] ;
memcpy(pByte , "AT^SNFS=2\r\n" , 11);
g_pSerialProcess->WriteCmd(pByte,11);
//g_pSerialProcess->ResumeThread();
return true;
}
bool CATCmd::AT_Set_Saic(){
BYTE pByte[20] ;
memcpy(pByte , "AT^SAIC=2,2,2\r\n" , 15);
g_pSerialProcess->WriteCmd(pByte,15);
//g_pSerialProcess->ResumeThread();
return true;
}
bool CATCmd::AT_Call(PTBYTE desTelNo,UINT len){
BYTE pByte[30] ;
if(len > 20) return false;
memcpy(pByte , "ATD" , 3);
memcpy(pByte + 3 , desTelNo , len);
pByte[len + 3] = ';';
pByte[len + 4] = '\r';
pByte[len + 5] = '\n';
g_pSerialProcess->WriteCmd(pByte,len + 6);
//g_pSerialProcess->ResumeThread();
return true;
}
bool CATCmd::AT_Accept()//接听
{
BYTE pByte[10] ;
memcpy(pByte , "ATA\r\n" , 4);
g_pSerialProcess->WriteCmd(pByte, 4);
//g_pSerialProcess->ResumeThread();
return true;
}
bool CATCmd::AT_Hangup()//挂机
{
BYTE pByte[10] ;
memcpy(pByte , "ATH\r\n" , 5);
g_pSerialProcess->WriteCmd(pByte, 5);
//g_pSerialProcess->ResumeThread();
return true;
}
//发短消息
bool CATCmd::AT_SendMsgStep1(PTBYTE msgCenterNo ,UINT msgCenterNo_len,
PTBYTE desTelNo ,UINT desTel_len,
PTBYTE msg, UINT msg_len){
BYTE pByte[10] ;
// AT_Set_MsgCenter(msgCenterNo,msgCenterNo_len);
// memcpy(pByte , "AT+CMGF=0\n" , 10);
// g_pSerialProcess->WriteCmd(pByte, 10);
int nPduLength; // PDU串长度
unsigned char nSmscLength; // SMSC串长度
TBYTE cmd[16]; // 命令串
//TBYTE pdu[512]; // PDU串
// 检查短消息内容是否空,或者超长
CString strUnicode;
WCHAR wchar[1024];
//memset(m_pdu,0,512);
int nCount = ::MultiByteToWideChar(CP_ACP, 0, (LPCSTR)msg, -1, wchar, 1024);
if(nCount <= 1)
{
AfxMessageBox("请输入消息内容!");
return false;
}
else if(nCount > 70) // 我们决定全部用UCS2编码,最大70个字符(半角/全角)
{
AfxMessageBox("消息内容太长,无法发送!");
return false;
}
SM_PARAM SmParam;
memset(&SmParam, 0, sizeof(SM_PARAM));
// 去掉号码前的"+"
CString strSmsc((LPCTSTR)msgCenterNo);
CString strNumber((LPCTSTR)desTelNo);
CString strContent((LPCTSTR)msg);
if(strSmsc[0] == '+') strSmsc = strSmsc.Mid(1);
if(strNumber[0] == '+') strNumber = strNumber.Mid(1);
// 在号码前加"86"
if(strSmsc.Left(2) != "86") strSmsc = "86" + strSmsc;
if(strNumber.Left(2) != "86") strNumber = "86" + strNumber;
// 填充短消息结构
strcpy(SmParam.SCA, strSmsc);
strcpy(SmParam.TPA, strNumber);
strcpy(SmParam.TP_UD, strContent);
SmParam.TP_PID = 0;
SmParam.TP_DCS = GSM_UCS2;
// 发送短消息
nPduLength = gsmEncodePdu(&SmParam, (char*)m_pdu); // 根据PDU参数,编码PDU串
strcat((char*)m_pdu, "\x01a"); // 以Ctrl-Z结束
gsmString2Bytes((char*)m_pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
nSmscLength++; // 加上长度字节本身
// 命令中的长度,不包括SMSC信息长度,以数据字节计
sprintf((char*)cmd, "AT+CMGS=%d\r\n", nPduLength / 2 - nSmscLength); // 生成命令
g_pSerialProcess->WriteCmd(cmd, strlen((char*)cmd)); // 先输出命令串
//g_pSerialProcess->ResumeThread();
// 根据能否找到"\r\n> "决定成功与否
return true;
}
bool CATCmd::AT_SendMsgStep2(){
g_pSerialProcess->WriteCmd(m_pdu, strlen((char*)m_pdu));
//g_pSerialProcess->ResumeThread();
return true;
}
//读短消息
bool CATCmd::AT_ReadMsg(UINT index){
CHAR pByte[15];
sprintf(pByte,"AT+CMGR=%d\r\n",index);
g_pSerialProcess->WriteCmd((PBYTE)pByte,strlen(pByte));
return true;
}
bool CATCmd::AT_MsgDecode(const char* pSrc, SM_PARAM* pDst){
gsmDecodePdu(pSrc,pDst);
return true;
}
bool CATCmd::AT_DelMsg(UINT index){
CHAR pByte[15];
sprintf(pByte,"AT+CMGD=%d\r\n",index);
int i=strlen(pByte);
g_pSerialProcess->WriteCmd((PBYTE)pByte,i);
return true;
}
//设置来电显示
bool CATCmd::AT_Set_ShowTelClue(){
BYTE pByte[15] ;
memcpy(pByte , "AT+CLIP=1\r\n" , 11);
g_pSerialProcess->WriteCmd(pByte, 11);
//g_pSerialProcess->ResumeThread();
return true;
}
//设置短消息到达提示命令
bool CATCmd::AT_Set_ShowMsgClue(){
BYTE pByte[20] ;
memcpy(pByte , "AT+CNMI=1,1,0,0,1\r\n" , 19);
g_pSerialProcess->WriteCmd(pByte, 19);
//g_pSerialProcess->ResumeThread();
return true;
}
bool CATCmd::AT_Read_Signal(){
return true;
}
bool CATCmd::AT_Read_MsgCenter(){
return true;
}
bool CATCmd::AT_Set_MsgCenter(PTBYTE msgCenterNo ,UINT msgCenterNo_len){
BYTE pByte[40] ;
if (msgCenterNo_len > 20)
{
return false;
}
memcpy(pByte , "AT+CSCA=\"" , 9);
memcpy(pByte + 9, msgCenterNo,msgCenterNo_len);
memcpy(pByte + 9 + msgCenterNo_len , "\"\r\n" , 3);
g_pSerialProcess->WriteCmd(pByte, 9 + msgCenterNo_len + 3);
//g_pSerialProcess->ResumeThread();
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -