/*-------------------------------------编码框架定义区----------------------*/ unsigned char code PDU_Enter[5] = { 0x0d, 0x0a, 0x0d, 0x0a, 0xff }; unsigned char xdata PDU_Enable[10] = { 0x41, 0x54, 0x2b, 0x43, 0x4d, 0x47, 0x46, 0x3d, 0x30, 0xff }; unsigned char xdata PDU_Length[12] = { 0x41, 0x54, 0x2b, 0x43, 0x4d, 0x47, 0x53, 0x3d, 0x00, 0x00, 0xff, 0x00 }; unsigned char xdata PDU_Code[300] = { 0x30, 0x38, 0x39, 0x31, 0x36, 0x38, 0x33, 0x31, 0x30, 0x38, 0x34, 0x30, 0x31, 0x35, 0x30, 0x35, 0x46, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x42, 0x38, 0x31, 0x33, 0x31, 0x39, 0x37, 0x36, 0x36, 0x39, 0x32, 0x38, 0x33, 0x46, 0x35, 0x30, 0x30, 0x30, 0x38, 0x41, 0x37, 0x30, 0x41, 0x30, 0x30, 0x34, 0x38, 0x30, 0x30, 0x34, 0x35, 0x30, 0x30, 0x34, 0x43, 0x30, 0x30, 0x34, 0x43, 0x30, 0x30, 0x34, 0x46, 0x1a, 0xff }; /*-----------------------------------END-------------------------------------*/ /*-------------------------------------函数区----------------------*/ //UART 相关函数------------------------ /*---------------------------------------------- 函数名:delay() 功能: 延时产生函数 time为延时参量 当time为1000时, 实际延时为43ms,并呈线性关系 作者:于振南 -----------------------------------------------*/ void delay(unsigned int time) { while(time--); } /*---------------------------------------------- 函数名:UART_Init() 功能: 串口初始化 通讯有关参数初始化 将串口波特率设定为9600bps(TC35i专用波特率) 作者:于振南 -----------------------------------------------*/ void tran_init() /* 通讯有关参数初始化 */ { PCON&=0x7f; TH1=0xFB; /* T1 use sio */ TL1=0xFB; /* 选择通讯速率9600bps*/ /* T1 use sio */ TMOD=0x21; /* T1=MODE2,sio; T0=MODE1,16bit,use time */ PS=1; /* SIO int high 优先级 */ EA=1; ET1=0; SM0=0; SM1=1; /* SM0=0 SM1=1,mode1,10bit */ SM2=0; /* data int,无校验(TB8=bit_duble偶) */ TR1=1; REN=1; RI=0; TI=0; ES=1; delay(50000); } /*------------------------------------------------------- 函数名:sio_int() interrupt 4 using 2 功能:中断方式接收串口数据 把收到的一个字节放在数组sbuf中 作者:于振南 ----------------------------------------------------------*/ void UART_Int() interrupt 4 using 2 { ES=0; if(RI) /* RI==1 */ { /*sbuf[counters++]=SBUF;*/ //接受操作屏蔽 //if(SBUF==0) isend=1; RI=0; } ES=1; } /*------------------------------------------------------- 函数名:send() 功能:用户函数,发送一个字节的数据 作者:于振南 ----------------------------------------------------------*/ void send(unsigned char mydata) { ES=0; TI=0; SBUF=mydata; while(!TI); TI=0; ES=1; } //UART----END------------------------------- //TC35i编码与通讯函数------------------- /*-------------------------------------------- 函数名:szzh10_sx() 功能 :将datax按jz进制转成字符串,存于p中 ---------------------------------------------*/ int szzh10_sx(int datax, char *p, int jz) { int i, j, len; char t[8]; i = 0; while (datax != 0) { if (jz >= 1 && jz <= 10) { t[i] = datax % jz + 48; datax = datax / jz; if (i >= 7) return 0; i = i + 1; } if (jz > 10) { if (datax % jz >= 10) { t[i] = datax % jz + 55; } if (datax % jz < 10) { t[i] = datax % jz + 48; } datax = datax / jz; if (i >= 7) return 0; i = i + 1; } } t[i] = '\0'; len = (int)strlen(t); j = len; for (i = 0; i < len; i++) { j = j - 1; p[i] = t[j]; } p[i] = '\0'; return 1; } /*-------------------------------------------- 函数名:PDU_Strlen() 功能 :计算编码长度,编码都以0xff为结束符 ---------------------------------------------*/ unsigned int PDU_Strlen(unsigned char *c) { unsigned int len; len = 0; while (c[len++] != 0xff) ; return len - 1; } /*-------------------------------------------- 函数名:PDU_Send() 功能 :发送编码,接着发出确认码 ---------------------------------------------*/ void PDU_Send(unsigned char *c) { int i; for (i = 0; i < PDU_Strlen(c); i++) send(c[i]); for (i = 0; i < PDU_Strlen(PDU_Enter); i++) send(PDU_Enter[i]); delay(10000); } /*-------------------------------------------- 函数名:PDU_EnablePDU() 功能 :开启PDU编码模式 ---------------------------------------------*/ void PDU_EnablePDU() { PDU_Send(PDU_Enable); } /*-------------------------------------------- 函数名:PDU_SetLength() 功能 :设置短信的内容字节数 ---------------------------------------------*/ void PDU_SetLength(int length) { char temp[4]; szzh10_sx(length + 14, temp, 10); strcpy((char*)(PDU_Length + 8), temp); PDU_Length[strlen((char*)PDU_Length)] = 0xff; PDU_Send(PDU_Length); } /*-------------------------------------------- 函数名:Word_Swap_F() 功能 :内部函数,为了解决编码中的一个细节 ---------------------------------------------*/ void Word_Swap_F(unsigned char *a, unsigned char *b) { *b = *a; *a = 'F'; } /*-------------------------------------------- 函数名:PDU_SMS() 功能 :发送短信的最终的函数 参数说明:SMS_Center为短信中心号码 11位 以字符串形式给出 SMS_Telenum为短信接收方的号码 11位 以字符串形式给出 SMS_Context为短信的内容,只限ascii码范围内的字符 最大为70个字符 ---------------------------------------------*/ void PDU_SMS(char *SMS_Center, char *SMS_Telenum, char *SMS_Context) { int i, j; unsigned char len; char lens[3]; /*----------set the SMS Center No--------------*/ for (i = 0, j = 0; i < strlen(SMS_Center) / 2; i++) { PDU_Code[6+(j++)] = SMS_Center[2 *i + 1]; PDU_Code[6+(j++)] = SMS_Center[2 *i]; } PDU_Code[6+j++] = 'F'; PDU_Code[6+j] = SMS_Center[strlen(SMS_Center) - 1]; /*---------------------------------------------*/ /*----------set the Reciever No--------------*/ for (i = 0, j = 0; i < strlen(SMS_Telenum) / 2; i++) { PDU_Code[26+(j++)] = SMS_Telenum[2 *i + 1]; PDU_Code[26+(j++)] = SMS_Telenum[2 *i]; } PDU_Code[26+j++] = 'F'; PDU_Code[26+j] = SMS_Telenum[strlen(SMS_Telenum) - 1]; /*---------------------------------------------*/ /*----------set the Code Length--------------*/ len = strlen(SMS_Context) *2; PDU_Code[44] = (len >> 4) > 9 ? (len >> 4) + 55: (len >> 4) + 48; PDU_Code[45] = (len &0x0f) > 9 ? (len &0x0f) + 55: (len &0x0f) + 48; /*---------------------------------------------*/ /*----------encode the context--------------*/ for (i = 46, j = 0; i < 46+strlen(SMS_Context) *4; i += 4) { PDU_Code[i] = '0'; PDU_Code[i + 1] = '0'; szzh10_sx((int)SMS_Context[j++], lens, 16); PDU_Code[i + 2] = lens[0]; PDU_Code[i + 3] = lens[1]; } PDU_Code[i++] = 0x1a; PDU_Code[i] = 0xff; /*---------------------------------------------*/ PDU_EnablePDU(); PDU_SetLength(strlen(SMS_Context) *2); PDU_Send(PDU_Code); } //TC35i----END--------------- /*-----------------------------------END-------------------------------------*/ //-------------调用实例--------------------------------------- void main() { UART_Init() ; PDU_SMS("13800451500","13796629385","Hello world!!"); while(1); } //