?? section6.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 + -