📄 gprs.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 + -