/*
函数名:void GSM_Send_CN_MSG(unsigned char *ucTargetPhone,unsigned char *ucSmsCentergetPhone,
unsigned char *ucContent)
函数功能:发送一条中文短信
参数: *ucTargetPhone 目标手机号码
*ucSmsCentergetPhone 短信中心号码
*ucContent 短信内容;
调用示例:GSM_Send_CN_MSG("8615990472896","8613800951500","你好!Hellow World!");
*/
void GSM_Send_CN_MSG(unsigned char *ucTargetPhone,unsigned char *ucSmsCentergetPhone,unsigned char *ucContent)
{
INT8U ucSMSCenter[20]; //存放颠倒后的短信中心号码
INT8U ucTgPhone[20];
//存放颠倒后的接收方电话号码
INT8U ucHead[100];
//协议头
INT8U ucMSG[200];
//协议数据
INT8U ucLEN[5];
//临时长度
INT8U ucPEnd[2]={0x1A,'\0'};
//结束符0x1A,也就是所谓的<Ctrl+Z>
GSM_TxString("AT+CMGF=0\r\n"); //设置以PDU格式发送接收短信
OSTimeDlyHMSM(0, 0, 1,0);
//颠倒短信中心号码
memset(ucSMSCenter,0,sizeof(ucSMSCenter));
GSM_InvertNumbers(ucSMSCenter,ucSmsCentergetPhone);
//颠倒接收方电话号码
memset(ucTgPhone,0,sizeof(ucTgPhone));
GSM_InvertNumbers(ucTgPhone,ucTargetPhone);
//组成协议数据
memset(ucMSG,0,sizeof(ucMSG));
GB2UnicodeStr(ucMSG,ucContent); //短信内容转成Unicode字符串,放到strMSG[]
strcat(ucMSG,ucPEnd);
//在末尾加个发送结束符0x1A,也就是所谓的<Ctrl+Z>
//拼接协议头
memset(ucHead,0,sizeof(ucHead));
strcat(ucHead,"08");
//08长度
strcat(ucHead,"91");
//91 国家代码
strcat(ucHead,ucSMSCenter);
//颠倒后的短信中心号码
strcat(ucHead,"11");
//11 短信消息类型 不需要状态报告 (31)需要报告
strcat(ucHead,"00");
//信息参考
I2HEXa8(ucLEN,strlen((char *)ucTargetPhone));//目标电话长度 转成十六进制形式的字符串
strcat(ucHead,ucLEN);
//目标电话长度
strcat(ucHead,"91");
//91 国家代码
strcat(ucHead,ucTgPhone);
//颠倒后的目标代码
strcat(ucHead,"00");
//协议标示 对于标准情况下的下 MS-to-SC 短消息传送,只需设置 PID 为 00
strcat(ucHead,"08");
//数据编码方案 08 或者04 均可发送出去
strcat(ucHead,"00");
//信息有效期 具体参考GSM 03.40 或者PDU中文的文档的计算方法
//将协议数据部分长度拼到协议头
I2HEXa8(ucLEN,strlen((char *)ucMSG)/2 ); //转成十六进制形式的字符串
strcat(ucHead,ucLEN);
//获取协议总体长度
I2DECa8(ucLEN ,(strlen((char *)ucMSG)/2)+15 );//转成十进制形式的字符串
//向串口发送AT指令
GSM_TxString("AT+CMGS=");
//发送短信
GSM_TxString(ucLEN);
//协议总长度
GSM_TxString("\r\n");
OSTimeDlyHMSM(0, 0, 0,800);
GSM_TxString(ucHead);
//写入协议头
GSM_TxString(ucMSG);
//写入协议数据
GSM_TxString("AT+CMGF=1\r\n"); //发送结束后,改回TXT模式,要不接收到的短信都是PDU格式的,以至于无法接收短信命令!
OSTimeDlyHMSM(0, 0, 0,500);
}
/* ------------------------------------------------------------------------- */
// 把一个16位整数转换为16进制的ASCII码字符串,例:0x1234 => "1234"
void I2HEXa16(char *str,INT16U num)
{
unsigned char BL;
BL= num&0x000F;
str[3]= (BL>9u) ? BL+'A'-10:BL+'0';
num>>=4; //右移4位
BL= num&0x000F;
str[2]= (BL>9u) ? BL+'A'-10:BL+'0';
num>>=4;
BL= num&0x000F;
str[1]= (BL>9u) ? BL+'A'-10:BL+'0';
num>>=4;
BL= num&0x000F;
str[0]= (BL>9u) ? BL+'A'-10:BL+'0';
str[4]='\0';
}
/* ------------------------------------------------------------------------- */
// 把一个8位整数转换为16进制的ASCII码字符串,例:0x12 => "12"
void I2HEXa8(INT8U *str,INT8U num)
{
unsigned char BL;
BL= num>>4;
str[0]= (BL>9u) ? BL+'A'-10:BL+'0';
BL= num&0x0F;
str[1]= (BL>9u) ? BL+'A'-10:BL+'0';
str[2]='\0';
}
/* ------------------------------------------------------------------------- */
// 把一个8位整数转换为10进制的ASCII码字符串,例:123 => "123"
void I2DECa8(INT8U *str,INT8U num)
{
str[0]= num/100+'0';
str[1]= (num/10)%10+'0';
str[2]= num%10+'0';
str[3]='\0';
}
/* ------------------------------------------------------------------------- */
// 查表将一个GB码转换为UNICODE码并返回,若找不到则返回 0
INT16U SearchGB(INT16U GB)
{
int i;<p> for(i = 0; i <7445; i++)
{
if(GB2312_Unicode[i][0] == GB)
return GB2312_Unicode[i][1]; //找到后返回相应的Unicode值
}
return 0; //查到最后都没有的话,返回0
}</p><p> </p><p>/* ------------------------------------------------------------------------- */
// 将GB码字符串转换为 UNICODE 码字符串,返回Unicode字符串的长度
INT16U GB2UnicodeStr(unsigned char *strto,unsigned char *strfrom)
{
INT16U GB=0;
INT16U Unicode=0;
INT16U temp=0;
INT16U i=0;
char str[5];
strto[0]='\0';//相当于清空这个字符串
i=0;
while(strfrom[i]!='\0')
{
if(strfrom[i]>0x7F)//大于ASCII码的值,判定为汉字字符
{
GB=strfrom[i++];
GB<<=8;
GB+=strfrom[i++];
Unicode=SearchGB(GB);
if(Unicode==0) return 0;
else
{
I2HEXa16(str,Unicode);
strcat((char *)strto,str);
}
}
else//否则为ASCII码
{ //只要把8位ASCII码扩展为16位就是相应的Unicode码了
temp=strfrom[i++];
I2HEXa16(str,temp);
strcat((char *)strto,str);
}
}
return strlen((char *)strto);
}
const INT16U GB2312_Unicode[7445][2] =
{
/*GB2312 |Unicode*/
0xA1A1, 0x3000, /* ' ' -> 12288 */
0xA1A2, 0x3001, /* '、' -> 12289 */
0xA1A3, 0x3002, /* '。' -> 12290 */
0xA1A4, 0x30FB, /* '·' -> 12539 */
0xF7FC, 0x9F3D, /* '鼽' -> 40765 */
0xF7FD, 0x9F3E, /* '鼾' -> 40766 */
0xF7FE, 0x9F44 /* '齄' -> 40772 */
};
/*******************************************************************
函数功能:正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
如:"8613851872468" --> "683158812764F8"
输入参数:pSrc: 源字符串指针
pDst: 目标字符串指针
返回值: 目标字符串长度
*********************************************************************/
void GSM_InvertNumbers(unsigned char* pDst,unsigned char* pSrc)
{
INT16U nSrcLength=0; // 字符串长度
INT16U i=0;
unsigned char strFrom[30];
strcpy(strFrom,pSrc);
nSrcLength = strlen((char *)strFrom);//得到原始字符串的长度
if(nSrcLength & 1)//源串长度是奇数吗?
{//如果是奇数,那就在源串末尾加个‘F’,让它的长度变为偶数。
strcat(strFrom,"F");
i=0;
while(strFrom[i]!='\0')
{
pDst[i] = strFrom[i+1];
pDst[i+1] = strFrom[i];
i+=2;
}
pDst[i] = '\0';
}
else //如果不是奇数,就直接转换
{
i=0;
while(strFrom[i]!='\0')
{
pDst[i] = strFrom[i+1];
pDst[i+1] = strFrom[i];
i+=2;
}
pDst[i] = '\0';
}
}</p>
转载地址:http://blog.csdn.net/mochouxiyan/article/details/8084836