⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs.c

📁 串口驱动,使用与单片机、微处理器。软件适用于前后台系统
💻 C
字号:
#include <msp430x14x.h>
#include <stdio.h>
#include <string.h>
#include "Sys.h"
#include "GPRS.h"



uint8  Duc_RingBufRxFlag=RINGBUFF_EMPTY;
uint8  Duc_FirstCharFlag= FIRST ;
void   Fun_CommbufInit(void) ; 

COMM_RING_BUF   Duc_commbuf;


/******************************************************************************* 
* 函 数 名: void  Fun_Usartinit()
* 功能描述: 
* 函数说明: 串口初始化
* 调用函数: 
* 全局变量: 
* 输    入: 
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
×使用寄存器定义:
  UxCTL
  7:PENA  校验允许位   6:PEV  奇偶校验位  5:SPB 停止位选择   4:CHAR  字符长度
  3:LISTEN 反馈选择  2:AYNC  USART模式选择   1:MM多机模式选择   0:SWRST  选择位
  UxTCTL
  6:SKPL  时钟极性控制位  5、4:SSELx 波特率发生器时钟源  3:URXEL  接收触发沿控制位
  2:TXWAKE  传输唤醒控制   1:Unused    0:TXTEPT  发送器空标志
  URCTL
  7:FE 帧错标志位  6:PE  校验错误标志位  5:OE  溢出错误标志位   4:BRK  打断检测位
  3:URXEIE  接收出错中断允许位   2:URXWIE  接收唤醒中断允许位   1:RXWAKE  接收唤醒检测位
  0:RXERRF  接收错误标志位。
  UxBR0
  UxBR1
  波特率选择寄存器
  UxMCTL
  波特率调整控制寄存器
  URXBUF
  接收数据缓存
  UTXBUF
  发送数据缓存
********************************************************************************/
void  Fun_Usart1init()
{
     P3SEL |= BIT6+BIT7;                        // P3.6,7 = USART0 TXD/RXD
     P3DIR |= BIT6;                          // P3.6 output direction  
     U1CTL|=SWRST;  //设置串口前先将该位置1
     ME2 |= UTXE1 + URXE1;            // 允许串口1接收和发送数据  
     UCTL1 |= CHAR;    //字符长度为8位
     UTCTL1 |= SSEL1;   //选中选子系统时钟SMCLK作为时钟源
     UBR01 = 0x68;                         // 4M,9600BPS
     UBR11 = 0x00;                         //
     UMCTL1 = 0x00;                        // No modulation
                           
     UCTL1&=~SWRST;  //设置完串口后将该位置0
     IE2 |= URXIE1+UTXIE1;  // Enable USART0 RX TX interrupt	
     IFG2 &=~UTXIFG1;   //经实验,初始化后会自动执行一次发送中断,为便于控制将该标志清零。
     Fun_CommbufInit();//环形缓冲区初始化
}



/******************************************************************************* 
* 函 数 名:  void Fun_CommbufInit(void)  
* 功能描述: 
* 函数说明: 环形缓冲区初始化
* 调用函数: 
* 全局变量: 
* 输    入: 
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
********************************************************************************/
void Fun_CommbufInit(void)  
{
    COMM_RING_BUF  *L_ptrbuf;
    L_ptrbuf=&Duc_commbuf;
    
    L_ptrbuf->RingBufRxInPtr =  &L_ptrbuf->RingBufRx[0];
    L_ptrbuf->RingBufRxOutPtr = &L_ptrbuf->RingBufRx[0];
    L_ptrbuf->RingBufRxCtr=0;
    
    L_ptrbuf->RingBufTxInPtr = &L_ptrbuf->RingBufTx[0];
    L_ptrbuf->RingBufTxOutPtr= &L_ptrbuf->RingBufTx[0];
    L_ptrbuf->RingBufTxCtr=0;  
}
/******************************************************************************* 
* 函 数 名:  int8  Fun_CommPutRxChar(uint8 c ) 
* 功能描述: 
* 函数说明: 把接收到的数据放入环形缓冲区
* 调用函数: 
* 全局变量: 
* 输    入: 
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
********************************************************************************/
void  Fun_CommPutRxChar(uint8 c )
{
    COMM_RING_BUF  *L_ptrbuf;    
    L_ptrbuf=&Duc_commbuf;    
    if(  L_ptrbuf->RingBufRxCtr  <  RECEIVE_CAP)
    {
         L_ptrbuf->RingBufRxCtr++;
         *L_ptrbuf->RingBufRxInPtr++=c;
         if(  L_ptrbuf->RingBufRxInPtr == &L_ptrbuf->RingBufRx[RECEIVE_CAP-1]  )
         {
             L_ptrbuf->RingBufRxInPtr = &L_ptrbuf->RingBufRx[0];
         }
         Duc_RingBufRxFlag=RINGBUFF_NOEMPTY;
     }
}

/******************************************************************************* 
* 函 数 名:  int8  Fun_CommGetTxChar( uint8 *err ) 
* 功能描述: 
* 函数说明: 从缓冲区中取出待发送的数据
* 调用函数: 
* 全局变量: 
* 输    入: 
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
********************************************************************************/
uint8  Fun_CommGetTxChar(  uint8 *err  ) 
{
     COMM_RING_BUF  *L_ptrbuf;
     L_ptrbuf=&Duc_commbuf;
     uint8   c;
     if(L_ptrbuf->RingBufTxCtr > 0)
     {
         L_ptrbuf->RingBufTxCtr--;
         c= *L_ptrbuf->RingBufTxOutPtr++;
         if(L_ptrbuf->RingBufTxOutPtr==&L_ptrbuf->RingBufTx[SEND_CAP-1])     
         {
             L_ptrbuf->RingBufTxOutPtr=&L_ptrbuf->RingBufTx[0];
         }
         *err=COMM_NO_ERR;
         return c;       
     } 
     else
     {
         *err=COMM_TX_EMPTY;
         return(NULL);
     }
     
}


/******************************************************************************* 
* 函 数 名:  void  Fun_PutChar()
* 功能描述: 
* 函数说明: 把发送的数据放入发送缓冲区
* 调用函数: 
* 全局变量: 
* 输    入: 
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
********************************************************************************/
void  Fun_PutChar(uint8  c  )
{
      COMM_RING_BUF  *L_ptrbuf;
      L_ptrbuf=&Duc_commbuf;
	  while( L_ptrbuf->RingBufTxCtr >= SEND_CAP );//当缓冲区满的时候应等待
       if(  L_ptrbuf->RingBufTxCtr < SEND_CAP )
       {
            L_ptrbuf->RingBufTxCtr++;
           *L_ptrbuf->RingBufTxInPtr++=c;
           if(  L_ptrbuf->RingBufTxInPtr == &L_ptrbuf->RingBufTx[SEND_CAP-1]  )
           {
               L_ptrbuf->RingBufTxInPtr = &L_ptrbuf->RingBufTx[0];
           }
		   
           if(L_ptrbuf->RingBufTxCtr==1)
           {
                     if(Duc_FirstCharFlag==FIRST)
                     {
                              IFG2=UTXIFG1;//首次发送触发串行口发送中断
	               }
	     }		   
       }
}


/******************************************************************************* 
* 函 数 名:  uint8  FunGetChar()
* 功能描述: 
* 函数说明: 从接收缓冲区中取出数据
* 调用函数: 
* 全局变量: 
* 输    入: 
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
********************************************************************************/
uint8  FunGetChar(uint8 *err)
{
     COMM_RING_BUF  *L_ptrbuf;
     L_ptrbuf=&Duc_commbuf;
     uint8   c;
     if(L_ptrbuf->RingBufRxCtr > 0)
     {
         L_ptrbuf->RingBufRxCtr--;
         c= *L_ptrbuf->RingBufRxOutPtr++;
         if(L_ptrbuf->RingBufRxOutPtr==&L_ptrbuf->RingBufRx[RECEIVE_CAP-1])
         {
             L_ptrbuf->RingBufRxOutPtr=&L_ptrbuf->RingBufRx[0];
         }
         *err=RINGBUFF_NOEMPTY;
	 return c ;	 
     }
     else
     {        
              Duc_RingBufRxFlag=RINGBUFF_EMPTY;
              *err=COMM_RX_EMPTY;
	       return 0 ;	      
     }
     
}

/******************************************************************************* 
* 函 数 名: __interrupt void Fun_Usart1_rx (void)
* 功能描述: 
* 函数说明: 串口1接收中断子程序
* 调用函数: 
* 全局变量: 
* 输    入: 
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
********************************************************************************/
#pragma vector=UART1RX_VECTOR
__interrupt void Fun_Usart1_rx (void)
{

   uint8  c;
   c = RXBUF1;   
   Fun_CommPutRxChar( c );  
   
}


/******************************************************************************* 
* 函 数 名: __interrupt void usart0_tx (void)
* 功能描述: 
* 函数说明: 串口1发送中断子程序
* 调用函数: 
* 全局变量: 
* 输    入: 
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
********************************************************************************/
#pragma vector=USART1TX_VECTOR
__interrupt void usart1_tx (void)
{	      
	 //uint8 i=250;
     uint8  c,L_err=0;
	 ALARM2_LED_ON;	 
     if(Duc_FirstCharFlag== FIRST )
     {
        Duc_FirstCharFlag= NOFIRST ;
     }
     c=Fun_CommGetTxChar( &L_err );
     if(L_err==COMM_NO_ERR)
     {
       // while ( (!(IFG2 & UTXIFG1)) && ((i--)==0) );
        TXBUF1=c;
     }
     else
     {
             Duc_FirstCharFlag= FIRST ;//发送完之后,首字节发送标志置位;            
			 ALARM2_LED_OFF; 
	 } 
	 
	 
}


/******************************************************************************* 
* 函 数 名:void   Fun_PutStr(uint8   *str  , uint8  l)
* 功能描述: 
* 函数说明:向发送缓冲区中放入一帧数据
* 调用函数: 
* 全局变量: 
* 输    入:       *str  指向一帧待发送数据的头不,l  本帧数据的长度
* 返    回: 
* 设 计 者:  Yuan                  日期:  2009-2-18
* 修 改 者:                         日期:
* 版    本:
********************************************************************************/
void  Fun_PutStr(uint8   *str  , uint8  lg)
{
      uint8   i,c;
	  for(i=0 ; i<lg ;  i++)
	  {     
                c=*str++;
                Fun_PutChar(c );
	  }
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -