?? gprs003.c
字號:
{
User_Data[j]=Temp_cArray[29+j];//直接提取數據到User_Data[]中
}
PDU_Len=Temp_cArray[28];
goto Cotinue0;
}
if((Temp_cArray[20]&0x08)==0X08)//短信是16bit編碼
{
SMS_Mode=2;
for(j=0;j<Temp_cArray[28]/2;j++)
{
User_Data[j]=Temp_cArray[30+2*j]; //將16bit數據轉換成8bit數據,放到User_Data[].
PDU_Len=Temp_cArray[28]/2;
}
}
//檢測是否為手機設置命令
Cotinue0:;
if((User_Data[0]=='*')&&(User_Data[1]=='S')&&(User_Data[2]=='E')&&(User_Data[3]=='T'))
{
for(j=0;j<=11;j++)
{
Center_SIM[j]=Temp_Sim[j];
}
Mobile_SMS_Set(PDU_Len);//手機短信設置、處理、返回正確應答。
}
if((User_Data[0]=='*')&&(User_Data[1]=='G')&&(User_Data[2]=='E')&&(User_Data[3]=='T'))
{
for(j=0;j<=11;j++)
{
Center_SIM[j]=Temp_Sim[j];
}
Mobile_SMS_Get(PDU_Len); //手機短信讀取、處理、返回相應數據。
}
if((User_Data[0]==0x68)&&(User_Data[7]==0x68))
{
for(j=0;j<=11;j++)
{
Center_SIM[j]=Temp_Sim[j];
}
ZheJiang_Protocol_Down(PDU_Len); //浙江規約SMS傳輸數據
}
}
if((DSR==0)&&(Rx1_Data_Buffer[i]==0x68)&&((Rx1_Data_Buffer[i+3]==0x68)||(Rx1_Data_Buffer[i+7]==0x68)))//接收到IEC102規約:轉發。
{
//while(Tx0_Snd_Lenth);
Data_Cmnd_Snd(Rx1_Lenth,&Rx1_Data_Buffer[i],0,20);//將串口1接收到的數據轉發給串口0。
Beat_Rcv_Fail=0;//心跳接收失敗次數復位。
Heart_Beat_Interval=600;//心跳信號時間間隔復位。
Heart_Beat_Flag=0;
Read_SMS_Time=60000;//10分鐘。
Minute2_Interval=12000;//2分鐘通信測試間隔。
Minute2_Interval_Flag=0;
Beat_Test_Start=0;
Second=0;
Minute=0;
Heart_Flag=0;
break;
}
}
}
//================================
//函數:Rx0Data_Judge_Trasmit();
//功能:將串口0接收到的數據轉發給串口1
//輸入參數:發送長度、發送緩沖區。
//輸出參數:
//=================================
void Rx0Data_Judge_Trasmit(void)
{
char i,j;
Uint Temp2;
DSR=P3IN&0X08; //P3.3:命令狀態/數據狀態。
for(i=0;i<Rx0_Pointer;i++)//檢測是否為設置命令
{
WDTCTL=WDTPW+WDTCNTCL;
if(Rx0_Data_Buffer[i]==0x2F)
{
if((Rx0_Data_Buffer[i+2]==90)&&(Rx0_Data_Buffer[i+5]==0xFD))
{ //尋找數據頭、判斷,若為設置命令。
Cal_Crc(&Rx0_Data_Buffer[i+1],88);//計算CRC
Temp2=Rx0_Data_Buffer[i+89];//比較CRC
Temp2=Temp2<<8;
Temp2=Temp2+Rx0_Data_Buffer[i+90];
if(CRC==Temp2)//若CRC相等,則為設置命令
{
Terminal_Addr_Low=Rx0_Data_Buffer[i-10];//取出終端地址低位
Terminal_Addr_High=Rx0_Data_Buffer[i-9];//取出終端地址高位
for(j=0;j<=90;j++)
{
Temp_iArray[j]=Rx0_Data_Buffer[i+j]; //將字符型數據轉換成整型->保存。
}
Wr_Data(Estart_Addr,91,Temp_iArray);//將設置數據寫到EEPROM中:0~90
Wr_Data(Estart2_Addr,91,Temp_iArray);//將設置數據寫到EEPROM中:0~90
Echo_Rx0(Echo_Array,8);//串口0正確設置應答、構造轉發命令。
Read_Parameters_Initial(Estart_Addr);
if(Read_Flag==0)//重新設置參數。
Read_Parameters_Initial(Estart2_Addr);
return;
}
}
if((Rx0_Data_Buffer[i+2]==7)&&(Rx0_Data_Buffer[i+5]==0xFC))
{ //尋找數據頭、判斷,若為抄讀命令。
Cal_Crc(&Rx0_Data_Buffer[i+1],5);//計算CRC
Temp2=Rx0_Data_Buffer[i+6];//比較CRC
Temp2=Temp2<<8;
Temp2=Temp2+Rx0_Data_Buffer[i+7];
if(CRC==Temp2)//若CRC相等,則為設置命令
{
Terminal_Addr_Low=Rx0_Data_Buffer[i-10];//獲取終端地址低位
Terminal_Addr_High=Rx0_Data_Buffer[i-9]; //獲取終端地址高位
Rd_Data(Estart_Addr,91,Temp_iArray);//將數據備份。100~190
for(j=0;j<=90;j++)
{
Temp_cArray[j]=Temp_iArray[j];
}
Temp_cArray[5]=0XFC;//功能碼。
Cal_Crc(&Temp_cArray[1],88);
Temp_cArray[89]=CRC>>8;//校驗碼。
Temp_cArray[90]=CRC;
Echo_Rx0(Temp_cArray,91);//串口0抄讀返回。
return;
}
}
}
if((DSR!=0)&&(Work_Mode==1))//若接收到終端數據時處于命令狀態,則主動連接主站
{
Heart_Beat_Flag=1;
Terminal_Request_Flag=1;
return;
}
if((DSR==0)&&(Rx0_Data_Buffer[i]==0x68)&&((Rx1_Data_Buffer[i+3]==0x68)||(Rx0_Data_Buffer[i+7]==0x68))) //轉發IEC102規約數據
{
Tx_Head=Rx0_Data_Buffer[i];
Data_Cmnd_Snd(Rx0_Pointer-1,&Rx0_Data_Buffer[i+1],1,10);//將串口0接收到的數據轉發給串口1
DSR=P3IN&0X08; //P3.3:命令狀態/數據狀態。
_3NOP();
if(Minute2_Interval_Flag==1)//數據狀態下,若2分鐘未數據通信,發送2個心跳測試璉路是否通暢。
{
Beat_Test_Start=1;
Beat_Test_Interval=2000;//
Beat_Test_Fail=0;
Beat_Rcved_Flag=0;
}
return;
}
if((Rx0_Data_Buffer[i]==0x68)&&((Rx0_Data_Buffer[i+3]==0x68)||(Rx0_Data_Buffer[i+7]==0x68)))//浙江規約上行數據
{
ZheJiang_Protocol_Up(Rx0_Pointer);
break;
}
}
}
//===============================
//函數: Echo_Rx0()
//功能:串口0正確設置應答
//輸入:
//輸出:
//===============================
void Echo_Rx0(char *Dpointer,char Dlenth)
{
char i,CheckSum=0;
WDTCTL=WDTPW+WDTCNTCL;
User_Data[0]=User_Data[3]=0x68;//數據頭
User_Data[1]=User_Data[2]=Dlenth+11;//數據長度
User_Data[4]=0x08; //控制字
User_Data[5]=Terminal_Addr_Low; //獲取終端地址低位
User_Data[6]=Terminal_Addr_High; //獲取終端地址高位
User_Data[7]=0x05;//類型
User_Data[8]=0x00;//可變結構限定詞
User_Data[9]=0x05;//傳送原因
User_Data[10]=0x10;//數據單元標識L
User_Data[11]=0x30;//數據單元標識H
User_Data[12]=0x00;//記錄地址
User_Data[13]=0x00;//串口號
User_Data[14]=Dlenth;//轉發長度
for(i=0;i<Dlenth;i++)
{
User_Data[15+i]=*(Dpointer+i);//轉發數據。
}
for(i=0;i<11+Dlenth;i++)//計算102規約校驗和
{
CheckSum+=User_Data[4+i];
}
User_Data[15+Dlenth]=CheckSum;//校驗碼
User_Data[16+Dlenth]=0x16;//結束碼
Data_Cmnd_Snd(Dlenth+17,User_Data,0,5);//向串口0發送要轉發的數據,發送長度Dlenth+17
_NOP();
}
//===============================
//函數:Gprs_AT_Command()
//功能:測試GPRS是否存在
//輸入參數:數據長度、命令、等待時間。
//返回參數:
//===============================
void Gprs_At_Command(Uint Lenth,char *Pcommand,Uint WTime)
{
Wait_Result_TimeOut=0;
Retry_Counter=3;//失敗重試三次。
Retry0:;
AT_Set_Ok=0;
Tx_Head=*Pcommand;
Data_Cmnd_Snd(Lenth-1,&Pcommand[1],1,WTime);//檢測GPRS是否存在并正確響應。
while(AT_Set_Ok==0)//等待結果碼
{
WDTCTL=WDTPW+WDTCNTCL;
if((Rx1_TimeOut_Flag==1)&&(Rx1_Pointer>2))//接收超時且接收到數據。
Rx1Data_Judge_Trasmit();
if(Wait_Result_TimeOut==1)
{
Wait_Result_TimeOut=0;
Retry_Counter--;
if(Retry_Counter!=0)//若沒有接收正確的結果碼,則重試3次。
{
Rx1_Pointer=0;
goto Retry0;
}
else
break;
}
}
}
//==========================
//函數:
//功能:初始化TIMERA
//輸入參數:
//輸出參數
//============================
void Timer_Initial(void)
{
Heart_Beat_Interval=6000;//自動檢測IP連接的間隔時間:30s
TACTL|=TASSEL1+ID1+TACLR;//定時器A時鐘源選系統主時鐘,1/4分頻,清除定時器。(1M)
CCTL0|=CCIE; //允許定時器A比較中斷
CCTL1|=CCIE;
CCR0=1250; //設置比較值
CCR1=1250; //設置定時器比較值。
TACTL|=MC0; //啟動連續計數模式
Flash_Timer_Len=0; //CPU正常運行指示燈。
Led1_Flash=0;
Heart_Beat_Flag=0; //自動檢測標志
Minute2_Interval=12000;//若3分鐘未通信,則重新檢測。
Minute2_Interval_Flag=0;
}
//==========================
//函數:Port_Initiale()
//功能:初始化端口
//輸入參數:無
//返回參數:無
//==========================
void Port_Initial(void)
{
P1DIR|=0XF7;//CS:P1.0; SK:P1.1; DI: P1.2; DO: P1.3(IN)
//LED1:P1.4; LED2:P1.5;LED3:P1.6;LED4:P1.7
P1OUT|=0XF0;
P1OUT&=0X6F;
P2DIR=0XFB;//P2.0:LED5;P2.1:LED6;p2.2--ring
P2OUT|=0X0B;
P3SEL&=0XF7;//P3.3: C/D STATUS.
P3DIR&=0XF7;//P3.3(IN):DSR
DSR=P3IN&0X08;//讀取當前在線狀態。
P4SEL=0X00;
P4DIR|=0X02;//P4.1 DTR輸出
P4OUT&=0XFD;//進入READY狀態。
P5SEL&=0X00;
P5DIR|=0XEF;//1110,1111
//P5OUT=0XFF;
//P5OUT&=0XDF;
VIO=P5IN&0X10;//VIO=P5.4
}
//=======================================
//函數:USART0_Initial()
//功能:初始化串口0
//輸入參數:Parity(0-none,1-odd,2-even),BaudRate
//輸出參數:無。
//=======================================
void USART1_Initial(void)
{
UCTL1|=SWRST; //SWRST置位
UCTL1&=~PENA; //無校驗
UCTL1|=CHAR; //字符長度為8位
UTCTL1|=SSEL0+URXSE; //選擇輔助時鐘ACLK,接收到數據,請求接收中斷服務
P3SEL |= 0xC0; // P3.6,7 = USART0 TXD/RXD
P3DIR |= 0x40; // P3.6 output direction
UBR01 = 0xA0;//默認波特率為9600
UBR11 = 0x01;//
UMCTL1= 0xB5;//波特率調整系數:10110101
UCTL1&=~SWRST; //SWRST復位,USARTY允許
ME2 |= UTXE1 + URXE1; // Enable USART0 TXD/RXD
IE2 |= URXIE1+UTXIE1;
Rx1_Start_Flag=0; //串口接收開始標志
Rx1_Time_Counter=0;//串口接收時間長度
Rx1_TimeOut_Flag=0;//接收超時標志
Rx1_Led=0x00;
Tx1_Led=0x00;
}
//================================
//函數:USART0_Initial()
//功能:初始化串口0
//輸入參數:Parity(0-none,1-odd,2-even),BaudRate
//輸出參數:無。
//=================================
void USART0_Initial(void) //串行口0初始化
{
UCTL0|=SWRST; //SWRST復位,USARTY允許
UTCTL0|=SSEL0+URXSE; //選擇輔助時鐘ACLK,接收到數據,請求接收中斷服務
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
P3DIR |= 0x10; // P3.4 output direction
UCTL0&=~PENA; //無校驗
UCTL0|=CHAR; //字符長度為8位
UBR00 = 0xA0;//默認波特率為9600
UBR10 = 0x01;//
UMCTL0= 0xB5;//波特率調整系數:10110101
UCTL0&=~SWRST; //SWRST復位,USARTY允許
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
IE1 |= URXIE0+UTXIE0; // Enable USART0 RX interrupt
Rx0_Start_Flag=0; //串口接收開始標志
Rx0_Time_Counter=0;//串口接收時間長度
Rx0_TimeOut_Flag=0;//接收超時標志
}
//===============================
//函數:Turn_Off_Gprs()
//功能:打開GPRS電源
//輸入參數:無
//輸出參數:無
//===============================
void Turn_Off_Gprs(void)
{
//P5OUT|=0X20;
//Delay(2500);
//P5OUT&=~0X20;
//Delay(1000);
for(;;)//模塊復位,重新啟動。
{
_5NOP();
}
}
//===============================
//函數:Turn_on_Gprs()
//功能:打開GPRS電源
//輸入參數:無
//輸出參數:無
//===============================
void Turn_On_Gprs(void)
{
P5OUT|=0X20;
Delay(200);
P5OUT&=~0X20;
Delay(4500);//等待45秒信號正常.
}
//=============================
//函數:Delay()
//功能:軟延時
//輸入參數:Delay_Len延時長度
//返回參數:
//==============================
void Delay(Uint Delay_Len)
{
Uint i;
while(Delay_Len--)
{
i=1000;
WDTCTL=WDTPW+WDTCNTCL;
while(i--); //4000*0.25US=1ms
}
}
//================================
//函數:TimerA_Int()
//功能:定時器A比較0中斷
//輸入參數:
//輸出參數:
//================================
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer0_A (void)
{
Flash_Timer_Len++;
if(Flash_Timer_Len==100)
{
CCR0=1250;
Flash_Timer_Len=0;
Led1_Flash^=0x10;//只改變1位.
P1OUT&=0XEF;
P1OUT|=Led1_Flash; //每秒鐘LED1 FLASH 一次。
}
if(Rx1_Start_Flag==1)//串口1接收計時
{
Rx1_Time_Counter++;
if(Rx1_Time_Counter>=(Rx1_Time_Interval+1))//CHANGED 11.5
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -