下面介绍WINCE下面AT指令发送中文短信
1、设置CSCA
int __stdcall setCSCA()
{
int isOK=-1;
DWORD dwWritenSize = 0;
DWORD dwReadSize;
if(m_serial == INVALID_HANDLE_VALUE)
{
RETAILMSG(1,(TEXT("m_serial == INVALID_HANDLE_VALUE \r")));
return isOK;
}
CString m_quest("at+csca=\"+8613010200500\"\r");
//CString m_quest("at+csq\r");
int j=m_quest.GetLength();
unsigned char *rel = new unsigned char[50];
memset(rel,0,sizeof(rel));
unsigned char *buf = new unsigned char[j];
for(int i = 0; i < j;i++)
buf[i] = (unsigned char)m_quest.GetAt(i); /* 转换为单字节字符 */
WriteFile(m_serial,buf,j,&dwWritenSize,NULL);
Sleep(200);
if(ReadFile(m_serial,rel,50,&dwReadSize,NULL))
{
CString tmp;
//tmp.Format(_T("%s"),rel);
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, pwText, dwNum);// 开始转换
tmp = pwText;
if(tmp.Find(L"OK")!=-1)
isOK=0;
//RETAILMSG(1,(TEXT("isOK %d"),isOK));
delete []pwText;
}
delete []buf;
delete []rel;
return isOK;
}
int __stdcall setCMGF()
{
//return 0;
int isOK=-1;
DWORD dwWritenSize = 0;
DWORD dwReadSize;
if(m_serial == INVALID_HANDLE_VALUE)
{
RETAILMSG(1,(TEXT("m_serial == INVALID_HANDLE_VALUE \r")));
return isOK;
}
CString m_quest=L"at+cmgf=0\r";
//CString m_quest("at+csq\r");
int j=m_quest.GetLength();
unsigned char *rel = new unsigned char[50];
memset(rel,0,sizeof(rel));
unsigned char *buf = new unsigned char[j];
for(int i = 0; i < j;i++)
buf[i] = (unsigned char)m_quest.GetAt(i); /* 转换为单字节字符 */
WriteFile(m_serial,buf,j,&dwWritenSize,NULL);
Sleep(200);
if(ReadFile(m_serial,rel,50,&dwReadSize,NULL))
{
CString tmp;
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, pwText, dwNum);// 开始转换
tmp = pwText;
if(tmp.Find(L"OK")!=-1)
isOK=0;
delete []pwText;
}
delete []buf;
delete []rel;
return isOK;
}
3、发送短信
int __stdcall sendMessage(const char *strNumber,const char *strContent)
{
SM_PARAM SmParam;
int j;
j=strlen(strNumber);
if(j < 11)
{
return 2;//手机号长度不对
}
CString strUnicode;
WCHAR wchar[1024];
CString strSmsc=L"8613010200500";
int nConut=strlen(strContent);
//RETAILMSG(1,(TEXT("content:%d "),strlen(strContent)));
if(nConut<=1)
{
return 3;
}
else if(nConut>140)
{
return 4;
}
char phoneNum[100];
memset(phoneNum,0,sizeof(phoneNum));
if(strNumber[0]!='8'&& strNumber[0]!='6')
{
phoneNum[0]='8';
phoneNum[1]='6';
strcpy(phoneNum+2,strNumber);
}
else
{
strcpy(phoneNum,strNumber);
}
for(int i=0;i<strSmsc.GetLength();i++)
{
SmParam.SCA[i]=strSmsc.GetAt(i);
}
strcpy(SmParam.TPA,phoneNum);
strcpy(SmParam.TP_UD, strContent);
//RETAILMSG(1,(TEXT("\r\nTP_UD lenght:%d"),strlen(SmParam.TP_UD)));
SmParam.TP_PID = 0;
SmParam.TP_DCS = 8;//使用UCS2编码
if(setSMS(&SmParam)==0)
{
return 0;
}
return -1;
}
4、通过设置短信中心发短信
int __stdcall sendMessage1(const char *strsmsc,const char *strNumber,const char *strContent)
{
SM_PARAM SmParam;
int j,m;
j=strlen(strNumber);
m=strlen(strsmsc);
if(j < 11 || m< 11)
{
return 2;//手机号长度不对
}
CString strUnicode;
WCHAR wchar[1024];
//CString strSmsc=L"8613010200500";
int nConut=strlen(strContent);
//RETAILMSG(1,(TEXT("content:%d "),strlen(strContent)));
if(nConut<=1)
{
return 3;
}
else if(nConut>140)
{
return 4;
}
char phoneNum[100];
memset(phoneNum,0,sizeof(phoneNum));
if(strNumber[0]!='8'&& strNumber[0]!='6')
{
phoneNum[0]='8';
phoneNum[1]='6';
strcpy(phoneNum+2,strNumber);
}
else
{
strcpy(phoneNum,strNumber);
}
char smcs[100];
memset(smcs,0,sizeof(smcs));
if(strsmsc[0]!='8'&& strsmsc[0]!='6')
{
smcs[0]='8';
smcs[1]='6';
strcpy(smcs+2,strsmsc);
}
else
{
strcpy(smcs,strsmsc);
}
strcpy(SmParam.SCA,smcs);
strcpy(SmParam.TPA,phoneNum);
strcpy(SmParam.TP_UD, strContent);
//RETAILMSG(1,(TEXT("\r\nSmParam.SCA")));
SmParam.TP_PID = 0;
SmParam.TP_DCS = 8;//使用UCS2编码
if(setSMS(&SmParam)==0)
{
return 0;
}
return -1;
}
5、其它用到的函数和结构体
int __stdcall setSMS(SM_PARAM* pSrc)
{
int nPduLength; // PDU串长度
unsigned char nSmscLength; // SMSC串长度
int nLength; // 串口收到的数据长度
char cmd[16]; // 命令串
char pdu[512]; // PDU串
char ans[128]; // 应答串
int isOK=-1;
DWORD dwWritenSize = 0;
DWORD dwReadSize;
//RETAILMSG(1,(TEXT("setMessage\r")));
if(m_serial == INVALID_HANDLE_VALUE)
{
//RETAILMSG(1,(TEXT("m_serial == INVALID_HANDLE_VALUE \r")));
return isOK;
}
nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串
strcat(pdu, "\x001a"); // 以Ctrl-Z结束
gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
nSmscLength++; // 加上长度字节本身
// 命令中的长度,不包括SMSC信息长度,以数据字节计
sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令
//for(int i;i<strlen(cmd);i++)
// RETAILMSG(1,(TEXT("%c"),cmd[i]));
//RETAILMSG(1,(TEXT("\r\n")));
//for(int j;j<strlen(pdu);j++)
//RETAILMSG(1,(TEXT("%c"),pdu[j]));
WriteFile(m_serial,cmd,strlen(cmd),&dwWritenSize,NULL);
//RETAILMSG(1,(TEXT("%s"),tmp3));
Sleep(200);
unsigned char *rel = new unsigned char[1024];
// int len;
memset(rel,0,sizeof(rel));
if(ReadFile(m_serial,rel,50,&dwReadSize,NULL))
{
CString tmp;
//tmp.Format(_T("%s"),rel);
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, pwText, dwNum);// 开始转换
tmp = pwText;
if(tmp.Find(L">")!=-1)
{
WriteFile(m_serial,pdu,strlen(pdu),&dwWritenSize,NULL);
int counter=0;
unsigned char *rel1 = new unsigned char[1024];
while(counter<10)
{
Sleep(300);
if(ReadFile(m_serial,rel1,200,&dwReadSize,NULL))
{
//RETAILMSG(1,(TEXT("ReadFile\r\n")));
DWORD dwNum3 = MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel1, -1, NULL, 0);
wchar_t *pwText3;
CString tmp3;
pwText3 = new wchar_t[dwNum3];
MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel1, -1, pwText3, dwNum3);// 开始转换
tmp3 = pwText3;
//RETAILMSG(1,(TEXT("%s"),tmp3));
if(tmp3.Find(L"OK")!=-1)
{
isOK=0;
}
delete []pwText3;
if(isOK==0)
{
break;
}
}
counter++;
}
delete []rel1;
}
delete []pwText;
}
delete []rel;
return isOK;
}