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

📄 section6.c

📁 msp430单片机基于modem数据传输的通讯程序设计
💻 C
字号:
#include <MSP430X14X.h>
#include "modem.h"
#include "uart.h"
#include "process.h"
#include "const.h"

//定义全局变量
static char nComm;
int *pFlash;
//定义串口操作变量
char nRev_UART0;	// 串口 0 的接收标志
char nRev_UART1;	// 串口 1 的接收标志
char UART0_TX_BUF[112];	// 串口 0 的发送缓冲区
char UART0_RX_BUF[20];	// 串口 0 的接收缓冲区
char UART1_TX_BUF[112];	// 串口 1 的发送缓冲区
char UART1_RX_BUF[50];	// 串口 1 的接收缓冲区
char pBuf0[100];
static int nTX1_Len;
static char nRX1_Len;
char nRX1_Len_temp;
static int nTX0_Len;
static int nRX0_Len;
int nRX0_Len_temp;
static char nTX0_Flag;
static char nTX1_Flag;
int nSend_TX0;
int nSend_TX1;
static char nComm_Command;
char nBusy;
char nDial;
void main(void)
{

    int j;
    int n;
    int nTemp;
    char nRes_UART1;
    char nRes_UART0;
    char PhoneNumber[8];
    char UART1_RX_Temp[50];
    char UART0_RX_Temp[30];    
    char nPhoneOK;
    int nPhone;
    
    WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗    
    
    _DINT();			// 关闭中断
    
    nBusy = 0;
    nDial = 0;
    nComm_Command = 0;
    nSend_TX1 = 0;
    nSend_TX0 = 0;
    nTX1_Flag = 0;
    nTX0_Flag = 0;
    nTX0_Len = 0;
    nTX1_Len = 0;
    nRX1_Len = 0;
    nRX0_Len = 0;
    nRev_UART1 = 0;
    nRev_UART0 = 0;
    nComm = 0;
    /////////////////////////////////
    // 初始化
    Init_CLK();
    Init_Process();
    Init_UART0();
    Init_UART1();
	_EINT(); 			// 打开中断
    // 读配置信息
    nPhone = ReadPhoneNum(PhoneNumber);
    // 等待配置信息
    if(nPhone == 2)
    {
    	for(;;)
    	{
    	    if(nRev_UART1 == 1)
    	    {
    	        nRev_UART1 = 0;
    	        for(i = 0;i < nRX1_Len;i++) 
    	            UART1_RX_Temp[i] = UART1_RX_BUF[i];
    	        nRes_UART1 = ProcessUART1(UART1_RX_Temp,nRX1_Len);
    	        switch(nRes_UART1)
    	        {
    	            case 0:
    	            {
    	            	SetOK(UART1_TX_BUF,&nTX1_Len);
    	            	nRX1_Len = 0;    	    	    
                        IFG2 |= UTXIFG1; // 设置中断标志,进入发送中断程序
    	            	break;
    	            }
    	            case 1:
    	            {
    	            	QueryPhone(UART1_TX_BUF,&nTX1_Len);
    	            	nRX1_Len = 0;    	    	    
                        IFG2 |= UTXIFG1; // 设置中断标志,进入发送中断程序
    	            	break;
    	            }
    	            case 2:
    	            {
    	            	nTemp = 0;
    	            	nTemp = SetPhone(UART1_RX_Temp);
    	            	if(nTemp == 1)
    	            	{
    	            	    SetOK(UART1_TX_BUF,&nTX1_Len);
    	    	    	
    	    	    	    nPhone = (char)(UART1_RX_Temp[12] - 0x30);
    	    	    	    for(i = 0;i < 8;i++) 
    	    	    	        PhoneNumber[i] = UART1_RX_Temp[13 + i];
    	    	    	
    	    	    	    nPhoneOK = 1;
    	            	}
    	            	else
    	            	{
    	            	    SetError(UART1_TX_BUF,&nTX1_Len);
    	            	}
    	            	nRX1_Len = 0;    	    	    
                        IFG2 |= UTXIFG1; // 设置中断标志,进入发送中断程序
    	            	break;
    	            }
    	            default:break;
    	        }
    	    }
    	    if(nPhoneOK == 1) break;
    	}
    	
    }
    for(;;)
    {
        
        //首先初始化MODEM
        if(nComm == 1 && nComm_Command == 0 && nBusy == 0)
        {		    
            // 将p1.0设置成高电平
            P2OUT |= BIT0;
            for(i = 0;i < 3;i++)
            {    
                nTX0_Len = ModemInit(UART0_TX_BUF);
                
                nBusy = 1;
                IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
                Delay_ms(500);
            }
        }//if(nComm == 1 && nComm_Command == 0 && nBusy == 0)

        // 拨号
        if(nComm == 1 && nDial == 0 && nComm_Command == 1 && nBusy == 0)
        {
            nBusy = 1;

    	    nTX0_Len = SetPhoneNum(UART0_TX_BUF,nPhone,PhoneNumber);    
            IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
	    	    
        }//if(nComm == 1 && nDial == 0 && nComm_Command == 1 && nBusy == 0)
        // 往MODEM传送数据
        if(nComm == 1 && nDial == 1)	
        {
     
            for(i = 0;i < 50;i++)
            {
            	for(n = 0;n < 100;n++)
            	{
            	    pBuf0[n] = i;
            	}
            	
            	while(1) // 等待缓冲区里的数据发送完毕
            	{
            	    if(nTX0_Flag == 1) break;            	     
            	}
            	nTX0_Len = PackData(UART0_TX_BUF,pBuf0,100);
         	    IFG1 |= UTXIFG0;// 设置中断标志,进入发送中断程序
            }
    	    // 数据已经发送完毕
    	    Delay_ms(100);
    	    // 发送+++命令,从传送数据状态到命令状态
 	        nTX0_Len = DataToCommand(UART0_TX_BUF);
 	
 	        nComm_Command = 2;
 	        nDial = 0; 
 	        IFG1 |= UTXIFG0;		// 设置中断标志,进入发送中断程序
    	
        }//if(nComm == 1 && nDial == 1)
     

        // 发送+++命令,从传送数据状态到命令状态
        if(nComm_Command == 2)
        {
            Delay_ms(1000);
            nTX0_Len = DataToCommand(UART0_TX_BUF);
            IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
            Delay_ms(1000);
        }//if(nComm_Command == 2)
        // 发送挂断命令
        if(nComm_Command == 3)
        {
            Delay_ms(1000);
            nTX0_Len = SetATH0(UART0_TX_BUF);
            IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
            Delay_ms(1000);
        }//if(nComm_Command == 3)
        //处理来自MODEM的响应
        if(nRev_UART0 == 1)
        {
            nRev_UART0 = 0;
    
            for(i = 0;i < nRX0_Len;i++) UART0_RX_Temp[i] = UART0_RX_BUF[i];
            nRes_UART0 = ProcessUART0(UART0_RX_Temp,nRX0_Len,0);
            nRX0_Len = 0;
    
            switch(nRes_UART0)
            {
    	        case 0:
    	        {
    	    
    	            break;
    	        }
    	        case 1:
    	        {
    	            nDial = 1;
    	            nBusy = 1;
    	            break;
    	        }
    	        case 2:
    	        {    
    	            break;
    	        }
    	        case 3:
    	        {   
    	            if(nComm_Command == 3)
    	            {
    	                nBusy = 0;
    	    	        nDial = 0;
    	    	        nComm_Command = 0;
    	            }
    	            nBusy = 0;
    	            nBusy = 0;
    	            break;
    	        }
    	        case 4:
    	        {
    	            if(nComm_Command == 0) 
    	            {
    	            	// 0表示发送初始化命令,1表示初始化完毕
    	    	        nComm_Command = 1;
    	    	        nBusy = 0;
    	            }
    	            if(nComm_Command == 2) 
    	            {
    	            	// 2表示发送+++,3表示收到+++响应
    	    	        nComm_Command = 3;
    	    	        // 数据已经发送完毕
    		        Delay_ms(1000);
    		        // 发送ATH0命令,挂断线路
    		        nTX0_Len = SetATH0(UART0_TX_BUF);
    		        // 设置中断标志,进入发送中断程序
                        IFG1 |= UTXIFG0;		
 		        Delay_ms(1000);
 		        break;
    	            }
    	            if(nComm_Command == 3) 
    	            {
    	    	        nBusy = 0;
    	    	        nDial = 0;
    	    	        nComm_Command = 0;
    	    	        nComm = 0;
    	    	        // 停止给MODEM供电
    	    	        for(i = 0;i < 5;i++) P2OUT &= ~(BIT0);
    	    	        for(i = 300;i > 0;i--) ;  // 延迟一点时间
    	    	        
    	    	        break;	
    	            }  
    	        }  	   
    	        case 5: // 没有接电话线的情况
    	        {
    	            nBusy = 0;
    	            nDial = 0;
    	            nComm_Command = 1;
    	            break;
    	        }    	
    	        case 6: // 对方挂断的情况
    	        {
    	            nBusy = 0;
    	            nDial = 0;
    	            nComm_Command = 1;
    	            break;
    	        }
    	        case 7:
    	        {
    	            // 2表示发送+++,3表示收到+++响应
    	            nComm_Command = 3; 
    	            // 数据已经发送完毕
    	            Delay_ms(1000);
    	            // 发送ATH0命令,挂断线路
    	            nTX0_Len = SetATH0(UART0_TX_BUF);
    	            // 设置中断标志,进入发送中断程序
                    IFG1 |= UTXIFG0; 
 	            Delay_ms(1000);
 	            break;
    	        }    	    	    	    	    	
    	        case 255:
    	        {
    	            nBusy = 0;
    	            break;
    	        }  
    	        case -1:
    	        {
    	            nBusy = 0;
    	            break;
    	        }  	    	  	    	
    	        default:
    	                break;
             }    	
         }//if(nRev_UART0 == 1) 
    }
}
////////////////////////////////////////
// 处理来自串口 0 的接收中断
interrupt [UART0RX_VECTOR] void UART0_RX_ISR(void)
{
    UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;	//接收来自的数据
    
    nRX0_Len_temp += 1;
    if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13)
    {
        nRX0_Len = nRX0_Len_temp;
        nRev_UART0 = 1;
        nRX0_Len_temp = 0;
    }  
}
////////////////////////////////////////
// 处理来自串口 0 的发送中断
interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void)
{
    if(nTX0_Len != 0)
    {
    	nTX0_Flag = 0;				// 表示缓冲区里的数据没有发送完
    	
    	TXBUF0 = UART0_TX_BUF[nSend_TX0];
    	nSend_TX0 += 1;
    	Delay_us(5);
    	if(nSend_TX0 >= nTX0_Len)
    	{
    	    nSend_TX0 = 0;
    	    nTX0_Len = 0;
    	    nTX0_Flag = 1;
    	}
    }
}
///////////////////////////////////////
// 处理来自串口 1 的接收中断
interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void)
{
    
    UART1_RX_BUF[nRX1_Len_temp] = RXBUF1;	//接收来自的数据
    
    nRX1_Len_temp += 1;
        
    if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
    {
    	nRX1_Len = nRX1_Len_temp;
    	nRev_UART1 = 1;
    	nRX1_Len_temp = 0;
    }
}
///////////////////////////////////////
// 处理来自串口 1 的发送中断
interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
{
    if(nTX1_Len != 0)
    {
    	nTX1_Flag = 0;			// 表示缓冲区里的数据没有发送完
    	
    	TXBUF1 = UART1_TX_BUF[nSend_TX1];
    	nSend_TX1 += 1;
    	
    	if(nSend_TX1 >= nTX1_Len)
    	{
    	    nSend_TX1 = 0;
    	    nTX1_Len = 0;
    	    nTX1_Flag = 1;
    	}
    }
}
///////////////////////////////////////
// 处理来自端口 1 的中断
interrupt [PORT1_VECTOR] void COMM_ISR(void)
{
    
    if(P1IFG & BIT5)
    {
    	nComm = 1;

    	nComm_Command = 0;
    	P1IFG &= ~(BIT5);	// 清除中断标志位
    	Delay_us(100);
    }
}

⌨️ 快捷键说明

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