先说下GSM短信发送的串口控制流程,之后再kl26上去实现 1,先发AT,等待回复OK ,没有成功一直发,成功后转向下一步 2,发送AT+CPIN? ,查询SIM卡是否正常,否一直查询,不过要有一个小延时后再去发送,成功转向下一步 3,发送 AT+CEG? ,查询是否正常注册到GSM网络,否一直查询,正常转向下一步 4,发送 AT+CMGF=1 ,发送英文短信,查询状态 是OK 5,AT+CMGS="15000268662" ,向15000298662发送一条英文短信,收到回复转向下一步 6,TEST ,这里要在最后加一个16进制的 1A做结束,进行内容发送, 7,等待发送完成后 停止 初学暂时只能做简单的修改 ,源码原型为.\YL-KL26Z 开发板\测试源码\MDK\YL-K26Z_demo\UART\Demo_Uart_Int先增加了 两个数组 用于AT指令的发送与接收,一个全局指针做 接收累加用, 采用串口2 中断方式 接收内容 源码更改为 void UART1_IRQHandler (void)
{
UART_MemMapPtr uartPtr = UART1_BASE_PTR;
#if UART1_SEND_IRQ
#endif
#if UART1_RECEIVE_IRQ
while (UART_S1_REG(uartPtr) & UART_S1_RDRF_MASK){
//接收的内容放入at_buff2 中,每放一个at_cont2加1
at_buff2[at_cont2++]=UART_D_REG(uartPtr);
}
#endif
}
发送采用及时发送,接收用延时做等待 之后分析结果
以下是部分源码
//----------------------------------------------------
INT8U strsearch( INT8U *ptr2, INT8U *ptr1)//²é×Ö·û´®*ptr2ÔÚ*ptr1ÖеÄλÖÃ
//±¾º¯ÊýÊÇÓÃÀ´¼ì²é×Ö·û´®*ptr2ÊÇ·ñÍêÈ«°üº¬ÔÚ*ptr1ÖÐ
//·µ»Ø: 0 ûÓÐÕÒµ½
// 1-255 ´ÓµÚN¸ö×Ö·û¿ªÊ¼Ïàͬ
{
// uchar max_length;
INT16U i,j,k;
// unsigned char flag;
if(ptr2[0]==0) return(0);
//max_length=strlen(ptr)+1;
// flag=0;
for(i=0,j=0;i<500;i++)
{
if(ptr1==ptr2[j])
{//µÚÒ»¸ö×Ö·ûÏàͬ
for(k=i;k<500;k++,j++)
{
if(ptr2[j]==0)//±È½ÏÕýÈ·
return(i+1); //·µ»ØÖµÊÇÕûÊý£¬²»º¬0
if(ptr1[k]!=ptr2[j]) break;
}
j=0;
}
if(ptr1==0) break;//±È½ÏÕýÈ·
}
return(0);
}
INT8U com1_send(INT8U *ptr)
{ at_cont2=0;
while(*ptr)
{
uart1SendChar(*ptr);
if(*ptr==0)
{ break;}
ptr++;
}
myDelay(10); //myDelay(2000);
if(at_cont2)
{ myDelay(20);at_cont2=0; return(1);
}
return(0);
}
/*********************************************************************************************************
** Function name: main
** Descriptions: UARTÖжϽÓÊÕÀý³Ì
** ʵÑéÏÖÏó£ºÉÏλ»ú·¢ËÍÊý¾Ý£¬MCU·µ»Ø½ÓÊÕµ½µÄÊý¾Ý
** input parameters: none
** output parameters: none
** Returned value: none
** Created by:
** Created Date:
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
*********************************************************************************************************/
int main (void)
{ INT8U i,j=0,t=0;;
SystemCoreClockUpdate(); /* ʱÖÓÅäÖà */
PORT_ENABLE_CLK(MKL_PORTA); /* GPIOʱÖÓʹÄÜ */
PORT_ENABLE_CLK(MKL_PORTB);
PORT_ENABLE_CLK(MKL_PORTC);
PORT_ENABLE_CLK(MKL_PORTD);
PORT_ENABLE_CLK(MKL_PORTE);
uart0Init(115200,0,0,8,1); /* UART0³õʼ»¯ */
uart1Init(115200,0,0,8,1);
strcpya(tmp_buff,"AT+CPIN?");
strcata(tmp_buff,"\x0d");at_cont=0;
at_cont2=0;
for(i=0;i<20;i++)
{ if(tmp_buff==0) break;
uart0SendChar(tmp_buff);
}
com1_send(tmp_buff);
myDelay(10);
// printf("\n\rMCU Start,Now you can input anykey... \r\n");
while(1){myDelay(20);
if(j==0)//AT
{ strcpya(tmp_buff,"ATE0V1\x0d");
i=com1_send(tmp_buff);
if(i)
{
/*AT OK
41 54 0D 0D 0A 4F 4B 0D 0A
*/
i= strsearch("OK",at_buff2);
if(i)
{j++;}
}
}
else if(j==1)//²éѯSIM¿¨ÊÇ·ñÕý³£ AT+CPIN?
{ strcpya(tmp_buff,"AT+CPIN?\x0d");
i=com1_send(tmp_buff);
if(i)
{ //SIM¿¨Õý³£
i= strsearch("+CPIN: READY",at_buff2);
if(i) {j++;}
}
}
else if(j==2)//²éѯGSMÍøÂçÊÇ·ñ×¢²á
{ strcpya(tmp_buff,"AT+CREG?\x0d");
i=com1_send(tmp_buff);
if(i)
{ // +CREG: 0,1 »ò("+CREG: 0,5 ±íʾÒѾע²áÉÏÍøÂç
i= strsearch("+CREG: 0,1",at_buff2);
if(i) {j++;}
else
{ i= strsearch("+CREG: 0,5",at_buff2);
if(i)
{j++;}
else myDelay(100);
}
}
}
else if(j==3)//½øÐжÌÐÅ·¢ËÍ
{ strcpya(tmp_buff,"AT+CMGF=1\x0d");
i=com1_send(tmp_buff);
//ÔÐÍ AT+CMGS="13818120592"
strcpya(tmp_buff,"AT+CMGS=\"");
strcata(tmp_buff,"15000298662");
strcata(tmp_buff,"\"\x0d");
i=com1_send(tmp_buff);
//-----ÄÚÈÝ TEST-----------------------
strcpya(tmp_buff,"TEST\x1a");
i=com1_send(tmp_buff);
/* ÕâÀïÌØ±ð×¢Ã÷£¬·¢¶Ì·¢Ë͵Äʱ¼äÒª±ÈÕý³£Ö¸ÁîµÈ´ýµÄʱ¼ä»¹Òª³¤
//+CMGS: 144
*/
for(t=0;t<200;t++)
{ myDelay(100);
i= strsearch("+CMGS: ",at_buff2);
if(i)
{j++;break;
}
}
}
//strsearch
} ;
}
如果以上看不明白,可以下载源码
Demo_Uart_Int.zip
(833.92 KB, 下载次数: 3)
|