STM32 GSM模块发送中文短信

/*
函数名: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)
{
&nbsp;unsigned char BL;
&nbsp; BL= num&0x000F;
&nbsp; str[3]= (BL>9u) ? BL+'A'-10:BL+'0';
&nbsp; num>>=4; //右移4位
&nbsp; BL= num&0x000F;
&nbsp; str[2]= (BL>9u) ? BL+'A'-10:BL+'0';
&nbsp; num>>=4;
&nbsp; BL= num&0x000F;
&nbsp; str[1]= (BL>9u) ? BL+'A'-10:BL+'0';
&nbsp; num>>=4;
&nbsp; BL= num&0x000F;
&nbsp; str[0]= (BL>9u) ? BL+'A'-10:BL+'0';
&nbsp;
&nbsp; str[4]='\0'; 
}
/* ------------------------------------------------------------------------- */
// 把一个8位整数转换为16进制的ASCII码字符串,例:0x12 => "12"
void I2HEXa8(INT8U *str,INT8U num)
{
&nbsp;unsigned char BL;
&nbsp; BL= num>>4;
&nbsp; str[0]= (BL>9u) ? BL+'A'-10:BL+'0';
&nbsp; BL= num&0x0F;
&nbsp; str[1]= (BL>9u) ? BL+'A'-10:BL+'0';
&nbsp; str[2]='\0'; 
}
/* ------------------------------------------------------------------------- */
// 把一个8位整数转换为10进制的ASCII码字符串,例:123 => "123"
void I2DECa8(INT8U *str,INT8U num)
{
&nbsp; str[0]=&nbsp; num/100+'0';
&nbsp; str[1]= (num/10)%10+'0';
&nbsp; str[2]=&nbsp; num%10+'0';
&nbsp; str[3]='\0'; 
}
/* ------------------------------------------------------------------------- */
// 查表将一个GB码转换为UNICODE码并返回,若找不到则返回 0
INT16U SearchGB(INT16U GB)
{
&nbsp; int&nbsp; i;<p>&nbsp; for(i = 0; i <7445; i++)
&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp; if(GB2312_Unicode[i][0] == GB) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GB2312_Unicode[i][1]; //找到后返回相应的Unicode值
&nbsp; }
&nbsp; return 0;&nbsp;//查到最后都没有的话,返回0
}</p><p>&nbsp;</p><p>/* ------------------------------------------------------------------------- */
// 将GB码字符串转换为 UNICODE 码字符串,返回Unicode字符串的长度
INT16U&nbsp; GB2UnicodeStr(unsigned char *strto,unsigned char *strfrom)
{
&nbsp;INT16U&nbsp; GB=0;
&nbsp;INT16U&nbsp; Unicode=0;
&nbsp;INT16U&nbsp; temp=0;
&nbsp;INT16U&nbsp; i=0;
&nbsp;char&nbsp;&nbsp;&nbsp; str[5];
&nbsp;
&nbsp; strto[0]='\0';//至关于清空这个字符串
&nbsp; i=0;
&nbsp;while(strfrom[i]!='\0')
&nbsp;{
&nbsp; if(strfrom[i]>0x7F)//大于ASCII码的值,断定为汉字字符
&nbsp;{
&nbsp; GB=strfrom[i++];
&nbsp; GB<<=8;
&nbsp; GB+=strfrom[i++];
&nbsp; Unicode=SearchGB(GB);
&nbsp; if(Unicode==0) return 0;
&nbsp; else
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; I2HEXa16(str,Unicode);
&nbsp;&nbsp;&nbsp; strcat((char *)strto,str);
&nbsp;&nbsp; }
&nbsp;}
&nbsp; else//不然为ASCII码
&nbsp;&nbsp;&nbsp; { //只要把8位ASCII码扩展为16位就是相应的Unicode码了
&nbsp; temp=strfrom[i++];
&nbsp; I2HEXa16(str,temp);
&nbsp; strcat((char *)strto,str);
&nbsp;}
&nbsp;}
&nbsp; return strlen((char *)strto);
}
const INT16U GB2312_Unicode[7445][2] =
{
/*GB2312 |Unicode*/
&nbsp; 0xA1A1, 0x3000,&nbsp; /* ' ' -> 12288 */
&nbsp; 0xA1A2, 0x3001,&nbsp; /* '、' -> 12289 */
&nbsp; 0xA1A3, 0x3002,&nbsp; /* '。' -> 12290 */
&nbsp; 0xA1A4, 0x30FB,&nbsp; /* '·'&nbsp; -> 12539 */&nbsp;      
&nbsp; 0xF7FC, 0x9F3D,&nbsp; /* '鼽' -> 40765 */
&nbsp; 0xF7FD, 0x9F3E,&nbsp; /* '鼾' -> 40766 */
&nbsp; 0xF7FE, 0x9F44&nbsp;&nbsp; /* '齄' -> 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编码