MSP430单片机与SIM800A调试

来源:互联网 发布:惠普企业软件 编辑:程序博客网 时间:2024/06/05 08:52

单片机发送GPRS程序

#include <msp430f5438a.h>

#include <stdlib.h>
#include <string.h>
#include "config.h"
//#include "24c64.h"


#define CPU_F ((double)8000000) 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 
/*****************************************************************************
* 函数声明区
*****************************************************************************/


void Init_RS232(void);
void RS232_SENDstr(char *tx_buf);


/******************************************************************************
* 变量定义区
******************************************************************************/
#define GprsFuse 0x02
#define GprsTure 0x01
uchar GprsState = 0;
unsigned RX_buffer=0;
unsigned RX_at=0;


uchar SendBuff[512] = {0};//12345678901234567890123456789012345678901234567890123456789012345678901234567890
//uchar SendBuff[1024] = {0};
uchar ATBuff[256] = {0};
//uchar DemoBuff[100] = {0};//abcdefghigklmnopqrstuvwxyzabcdefghijklm
//uint bysendpt = 0;
//uint byrecpt = 0;
//char bystartcomm = 0;


//uint byatsendpt =0;
//uint byatrecpt =0;
//char byatcomm = 0;
uint gprsreclen=0;
uint gprssendwritept=0;
uint gprssendreadpt=0;
//***********************************************************************
//                   系统时钟初始化,XT1=32.768K晶振,XT2=8M晶振
//***********************************************************************
void Clock_Init_Ex32768()
{
  P5SEL |= BIT2 + BIT3;             // 端口功能选择振荡器
  P7SEL |= BIT0 + BIT1;
  UCSCTL6   &= ~XT2OFF+~XT1OFF;
  UCSCTL4 |= SELA_0 + SELM_5 + SELS_5;    //ACLK为32.768KHZ,MCLK为8MHZ,SMCLK为8MHZ
   do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                          
    SFRIFG1 &= ~OFIFG; 
  }while(SFRIFG1&OFIFG);                        // 检测振荡器错误标志 
}




static unsigned long  OpenGprs()//static unsigned long 
{
  //uchar readdata = 0;      //GPRS开机标志,1表示开机成功
  P6DIR |= BIT3;
  //P4DIR &= ~BIT0;
  P6OUT |= BIT3; //GPRS TURN ON
  //P4OUT |= BIT2;
  delay_ms(1500);
  P6OUT &= ~BIT3;
  delay_ms(20);
 // P4OUT |= BIT1; //GPRS TURN ON
 // delay_ms(220);
 // P4OUT &= ~BIT1;
  //readdata = P4IN;
  //readdata = readdata & BIT0;
  
  //return  readdata;//(P4IN & BIT0);//readdata;
  return 0;
}


void ShutdownGprs()
{
  P6DIR |= BIT3;
  //P4DIR &= ~BIT0;
  P6OUT |= BIT3; //GPRS shout down
  //P4OUT |= BIT2;
  delay_ms(1500);
  P6OUT &= ~BIT3;
  delay_ms(20);
  
}




void SendAtCmd( char const * atcmd)
{       
        unsigned char len;
        len = strlen(atcmd);
        
memcpy(ATBuff, atcmd, len);
ATBuff[len] = 0x0D;
ATBuff[len+1] = 0x0A;
        gprssendwritept = len+2;
UCA0TXBUF = ATBuff[0];
        gprssendreadpt = 1;
}


void SendData( char const * atcmd)
{       
        unsigned char len;
        len = strlen(atcmd);
        
memcpy(ATBuff, atcmd, len);
ATBuff[len] = 0x1A;
//ATBuff[len+1] = 0x0A;
        gprssendwritept = len+1;
UCA0TXBUF = ATBuff[0];
        gprssendreadpt = 1;
}


static unsigned long ResetGprs()//static unsigned long 
{
  //uchar readdata = 0;      //GPRS开机标志,1表示开机成功
  SendAtCmd("AT+CPOWD=1");
  delay_ms(10000);
  return OpenGprs();
}
///////////////////////////////////////////////////////////////////////////////
uchar strsearch(uchar *ptr2,uchar *ptr1_at)//查字符串*ptr2在*ptr1中的位置
//本函数是用来检查字符串*ptr2是否完全包含在*ptr1中
//返回:  0  没有找到
//       1-255 从第N个字符开始相同
{
//、 uchar max_length;
uchar i,j,k;
//uchar flag;
if(ptr2[0]==0) return(0);
//flag=0;
for(i=0,j=0;i<254;i++)
{
        if(ptr1_at[i]==ptr2[j])
        {//第一个字符相同
        for(k=i;k<254;k++,j++)
        {
        if(ptr2[j]==0)//比较 正确
        return(i+1);               //返回值是整数,不含0
        if(ptr1_at[k]!=ptr2[j]) break;
        }
        j=0;
        }
}
return(0);
}
/////////////////////////////////////////////////////////////////////////////
static unsigned long GprsSendData(char const * Data )
{       
        uchar  j;
        //uchar err=0;
        delay_ms(10000);
        SendAtCmd("AT");
        delay_ms(500);
        SendAtCmd("AT");
        delay_ms(500);
        SendAtCmd("AT");
        delay_ms(500);
        SendAtCmd("AT");
        delay_ms(500);
        SendAtCmd("ATE0");
        delay_ms(500);
        SendAtCmd("AT+CPIN?");
              delay_ms(500);
              if(strsearch("READY",SendBuff) !=0)
              {
               GprsState = GprsTure; 
              }
        SendAtCmd("AT+CREG=1");
        delay_ms(500);
        for(j=0;j<=20;j++)
        {
        SendAtCmd("AT+CREG?");
              delay_ms(500);
               if(strsearch("+CREG: 1,5",SendBuff)==0 && strsearch("+CREG: 1,1",SendBuff)==0)
      {  
                          GprsState = GprsFuse;
                          //return GprsState;
                          //SendAtCmd("AT+CREG?");
      }
                  else 
                        {
                         GprsState = GprsTure;
                         break;
                        }
        }
        
         /*if(j>=19)
          {
            goto at_eer;
          }*/
        SendAtCmd("AT+CSQ");
        delay_ms(500);
        SendAtCmd("AT+CGATT=1");
        delay_ms(5000);
        SendAtCmd("AT+CGREG=1");
        delay_ms(500);
        for(j=0;j<=20;j++)
        {
        SendAtCmd("AT+CGREG?");
              delay_ms(500);
              if(strsearch("+CGREG: 1,5",SendBuff)==0 && strsearch("+CGREG: 1,1",SendBuff)==0)
                        {  
                          GprsState = GprsFuse;
                          //return GprsState;
                          //SendAtCmd("AT+CGREG?");
      }
                  else 
                        {
                         GprsState = GprsTure;
                         break;
                        }
        }
        /*if(j>=19)  //模块有问题
        {
          at_eer:     ResetGprs(); //模块重启  AT+CFUN=1,1
        }*/
        /*SendAtCmd("AT^SICS=0,conType,GPRS0");
        delay_ms(500);
        SendAtCmd("AT^SICS=0,user,gprs");
        delay_ms(500);
        SendAtCmd("AT^SICS=0,passwd,gprs");
        delay_ms(500);
        SendAtCmd("AT^SICS=0,apn,“cmnet”");
        delay_ms(500);
        SendAtCmd("AT^SISS=1,ConID,0");
        delay_ms(500);
        SendAtCmd("AT^SISS=1,srvType,Socket");
        delay_ms(500);
        SendAtCmd("at^siss=1,address,\"socktcp://218.75.124.157:9400\"");
        //AT^SISS=1,address,"Socktcp://218.17.126.193:5003"
        //at^siss=1,address,"socktcp://218.75.124.157:9400"
        delay_ms(500);
        SendAtCmd("at^siso=1");
                  delay_ms(5000);
                  if(strsearch("^SISW: 1, 1",SendBuff)==0)
                      {
                       GprsState = GprsFuse; 
                      }
                  else
                      {
                       GprsState = GprsTure; 
                      }
        SendAtCmd("AT^SISW=1,10");
        delay_ms(500);*/
        
        SendAtCmd("AT+CSTT=\"CMNET\"");
        delay_ms(500);
        SendAtCmd("AT+CIICR");
        delay_ms(10000);
        SendAtCmd("AT+CIFSR");
        delay_ms(500);
        SendAtCmd("AT+CIPSTART=\"TCP\",\"218.75.124.157\",\"9400\"");
        delay_ms(500);
        SendAtCmd("AT+CIPSEND");
        delay_ms(1000);
//       SendAtCmd("abcdefg");
//       delay_ms(10000);
//        SendAtCmd(Data);
        SendData(Data);
        delay_ms(10000);
        //SendAtCmd("at^sisc=1");
        //delay_ms(500);
        //if 
        SendAtCmd("AT+CIPCLOSE");
        delay_ms(500);
        SendAtCmd("AT+CPOWD=1");
        delay_ms(1000);
//        return GprsState;
}
/*********************************系统主函数据********************************/


void main(void)
{
        P2DIR |= BIT5;
WDTCTL = WDTPW + WDTHOLD;              // 关狗
        Clock_Init_Ex32768();
LEDLIGHT;                 //点亮LED
        Init_RS232();                             //串口初始化
_EINT();                                  //开全局中断
        GprsState=OpenGprs();        //GPRS开机
        //SendAtCmd("AT^SMSO");
        //delay_ms(15000);
        //GprsState=ResetGprs();

        
        gprsreclen = 0;
        gprssendwritept = 0;
        gprssendreadpt = 0;
        
        
       /* SendAtCmd("AT");
        delay_ms(500);
        SendAtCmd("ATE0");
        delay_ms(500);
        SendAtCmd("AT+CPIN?");
        delay_ms(500);
        SendAtCmd("AT+CREG=1");
        delay_ms(500);
        SendAtCmd("AT+CREG?");
        delay_ms(500);
        SendAtCmd("AT+CSQ");
        delay_ms(500);
        SendAtCmd("AT+CGATT=1");
        delay_ms(500);
        SendAtCmd("AT+CGREG=1");
        delay_ms(500);
        SendAtCmd("AT+CGREG?");
        delay_ms(500);
        SendAtCmd("AT^SICS=0,conType,GPRS0");
        delay_ms(500);
        SendAtCmd("AT^SICS=0,user,gprs");
        delay_ms(500);
        SendAtCmd("AT^SICS=0,passwd,gprs");
        delay_ms(500);
        SendAtCmd("AT^SICS=0,apn,“cmnet”");
        delay_ms(500);
        SendAtCmd("AT^SISS=1,ConID,0");
        delay_ms(500);
        SendAtCmd("AT^SISS=1,srvType,Socket");
        delay_ms(500);
        SendAtCmd("at^siss=1,address,\"socktcp://218.75.124.157:9400\"");
        //AT^SISS=1,address,"Socktcp://218.17.126.193:5003"
        //at^siss=1,address,"socktcp://218.75.124.157:9400"
        delay_ms(500);
        SendAtCmd("at^siso=1");
        delay_ms(30000);
        SendAtCmd("AT^SISW=1,10");
        delay_ms(500);
        SendAtCmd("0123456789");*/
        GprsSendData("0123456789");
        delay_ms(500);
        
        GprsState=ResetGprs();
        //SendAtCmd("AT^SMSO");
        //delay_ms(5000);
while(1)
{
    LEDLIGHT;                  //点亮LED
    delay_ms(500);
    LEDDARK;                  //熄灭LED
    delay_ms(500);
}
  
}








/******************************************************************************
* 函数名:void Init_RS232(void)
* 功  能:RS232初始化
* 参  数:无
* 返回值:无
******************************************************************************/


void Init_RS232(void)
{
  /*P3SEL |= 0x30;                             // 选择RS232引脚功能
  P3DIR |= BIT4;
  P3DIR &= ~BIT5;
  UCA0CTL1 |= UCSWRST;                      // 复位UART状态机
  UCA0CTL1 |= UCSSEL__SMCLK;                     // CLK = ACLK
  UCA0BR0 = baud_l;// 0x03;                           // 32kHz/9600=3.41
  UCA0BR1 = baud_h;//0x00;                           //
//  UCA0MCTL = UCBRS_3+UCBRF_0;               // UCBRSx=3, UCBRFx=0
  UCA0CTL1 &= ~UCSWRST;                     // 启动UART
  UCA0IE |= UCRXIE;                         // 数据接收中断使能
  UCA0IE |= UCTXIE;  */                       // 数据接收中断使能


  P3SEL |= 0x30;                             // 选择RS232引脚功能
  P3DIR |= BIT4;
  P3DIR &= ~BIT5;
  UCA0CTL1 |= UCSWRST;                      // 复位UART状态机
  UCA0CTL1 |= UCSSEL__SMCLK;                     // CLK = ACLK
  UCA0BR0 = atbaud_l;// 0x03;                           // 32kHz/9600=3.41
  UCA0BR1 = atbaud_h;//0x00;                           //
  UCA0MCTL = UCBRS_3+UCBRF_0;               // UCBRSx=3, UCBRFx=0
  UCA0CTL1 &= ~UCSWRST;                     // 启动UART
  UCA0IE |= UCRXIE;                         // 数据接收中断使能
  UCA0IE |= UCTXIE;                         // 数据发送中断使能    
}






/////////////////////////////////////////////////////////////////////////////////////////
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
  switch(__even_in_range(UCA0IV,4))
  {
case 0: //Vector 0 - no interrupt
break;
case 2: //Vector 2 - RXIFG
RX_at=UCA0RXBUF;
SendBuff[gprsreclen] = RX_at;
gprsreclen++;
if (gprsreclen >=512)
{
gprsreclen = 0;
}
           break;
case 4: //Vector 4 - TXIFG
if (gprssendreadpt < gprssendwritept)
{
UCA0TXBUF = ATBuff[gprssendreadpt];
gprssendreadpt++;
                }
else //if//(gprssendreadpt >= gprssendwritept)
{
                        //delay_ms(3);
       gprssendreadpt = 0;
}
                
break;
                
default: break;  
  }
}
原创粉丝点击