?? gprs data for wavecom q2406b(v2.0).#3
字號(hào):
/****************************************Copyright (c)**************************************************
內(nèi)蒙古工業(yè)大學(xué)信息學(xué)院GPS車載開發(fā)小組
**--------------File Info-------------------------------------------------------------------------------
** File name: GPRS數(shù)傳實(shí)驗(yàn)程序
** Last modified Date: 2006-1-5
** Last Version: 1.0
** Created by: 孫作雷
** Descriptions: 完成GPRS模塊WAVECOME Q2406的撥號(hào)連接并自動(dòng)設(shè)定服務(wù)器端的IP地址和監(jiān)聽端口,可自動(dòng)
重?fù)軆纱危繐芴?hào)一次將產(chǎn)生一聲峰鳴提示,若三次撥號(hào)均未成功建立與服務(wù)器端的數(shù)傳連
接,則峰鳴10聲報(bào)警,需手工重啟模塊。如成功進(jìn)入數(shù)傳狀態(tài),則實(shí)驗(yàn)板上的8個(gè)LED同時(shí)閃
爍3次,可按KEY1鍵向服務(wù)器端發(fā)送預(yù)設(shè)的字符串"北緯40.506290度,東經(jīng)11.1405032度",
同時(shí)可接收上位機(jī)發(fā)來的0-6的數(shù)字字符,每接收到一個(gè)字符,峰鳴一次,并將加3后的數(shù)值
送回上位機(jī)全部LED閃爍一次,按KEY2鍵退出數(shù)傳狀態(tài),并斷開與GPRS網(wǎng)絡(luò)的連接,全部LED
閃爍15次。
**
********************************************************************************************************/
#include "config.h"
#include<string.h>
#include<ctype.h>
#define BEEP (1<<7)
#define KEY1 (1<<16) // P0.16
#define KEY2 (1<<17) // P0.17
/*聲明任務(wù)*/
void Task_Send(void *mydata) reentrant;//發(fā)送任務(wù)
void Task_Receive(void *mydata) reentrant;//接受任務(wù)
void Task_KeyBoard(void *mydata) reentrant;//鍵盤查詢?nèi)蝿?wù)
/* 定義串口模式設(shè)置數(shù)據(jù)結(jié)構(gòu) */
typedef struct UartMode
{
uint8 datab; // 字長(zhǎng)度,5/6/7/8可選
uint8 stopb; // 停止位,1/2可選
uint8 parity; // 奇偶校驗(yàn)位,0-無校驗(yàn),1-奇校驗(yàn),2-偶校驗(yàn)
}UARTMODE;
volatile uint8 D=1,E=0; // D為進(jìn)入數(shù)傳狀態(tài)標(biāo)志,E為接收到數(shù)傳狀態(tài)建立信號(hào)Ok_Info_WaitingForData標(biāo)志。
const uint32 LEDS=(0xff<<18);
volatile *int Sendstr;
const char *in[10]={
"AT#APNSERV=\"CMNET\"\r",
"AT+CGATT=1\r",
"AT#TCPPORT=\"6800\"\r",
"AT#TCPSERV=\"202.207.28.17\"\r",
"AT#CONNECTIONSTART\r",
"AT#OTCP\r",
"北緯40.506290度,東經(jīng)11.1405032度",
"+++",
"AT#CONNECTIONSTOP\r",
"AT+CGATT=0\r"
};
/*
******************************************************************************************
** 函數(shù)名稱 : DelayNS()
** 函數(shù)功能 : 長(zhǎng)軟件延時(shí)。
** 入口參數(shù) : dly 延時(shí)控制值,值越大延時(shí)越長(zhǎng)
** 出口參數(shù) : 無
******************************************************************************************
*/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
/*
******************************************************************************************
** 函數(shù)名稱 : Beep()
** 函數(shù)功能 : 產(chǎn)生形參對(duì)應(yīng)次數(shù)的峰鳴
** 入口參數(shù) : n 峰鳴的次數(shù)
** 出口參數(shù) : 無
******************************************************************************************
*/
void Beep (uint8 n)
{
for(; n>0; n--)
{
IO0CLR = BEEP; // 峰鳴
DelayNS(20); // 延時(shí)
IO0SET = BEEP; // 停止峰鳴
DelayNS(30); // 延時(shí)
}
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :LEDS_Flash()
** 函數(shù)功能 :8個(gè)LED同時(shí)閃爍,閃爍次數(shù)由形參決定
** 入口參數(shù) :n 閃爍的次數(shù)
** 出口參數(shù) :無
*********************************************************************************************************
*/
void LEDS_Flash (uint8 n)
{
uint8 i = 0;
while (i<n)
{
IO1CLR = LEDS; // 控制LEDS亮
DelayNS(50); // 延時(shí)
IO1SET = LEDS; // 控制LEDS滅
DelayNS(50); // 延時(shí)
i++;
}
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :UART0_SendByte()
** 函數(shù)功能 :向串口0發(fā)送1字節(jié)數(shù)據(jù)
** 入口參數(shù) :dat 要發(fā)送的數(shù)據(jù)
** 出口參數(shù) :無
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
U0THR = dat; // 要發(fā)送的數(shù)據(jù)
while ((U0LSR & 0x20) == 0); // 等待發(fā)送完成
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :UART0_SendStr()
** 函數(shù)功能 :向串口發(fā)送字符串
** 入口參數(shù) :str 要發(fā)送的字符串的首地址指針
** 出口參數(shù) :無
*********************************************************************************************************
*/
void UART0_SendStr(char const *str)
{
for( ; *str!='\0'; str++)
UART0_SendByte (*str);
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :Send_GPRSAT()
** 函數(shù)功能 :發(fā)送GPRS建立數(shù)傳狀態(tài)的AT指令
** 入口參數(shù) :無
** 出口參數(shù) :無
*********************************************************************************************************
*/
void Send_GPRSAT(void) //在發(fā)送前4條時(shí),關(guān)閉中斷,不接收模塊返回值,在發(fā)送第5條指令前開啟中斷
{
uint8 i;
U0IER = 0x00;
for(i=0;i<5;i++)
{
UART0_SendStr(in[i]);
DelayNS(500);
}
DelayNS(500);
U0IER = 0x05; // 允許RBR中斷
UART0_SendStr(in[5]);
DelayNS(500);
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :IRQ_UART0()
** 函數(shù)功能 :串口0接收中斷服務(wù)程序
** 入口參數(shù) :無
** 出口參數(shù) :無
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
uint8 k=0,IIR,a;
while(((IIR=U0IIR)&0x01)==0)//LPC2131串口只有一個(gè)中斷入口,它跳入中斷子程序后要依靠中斷標(biāo)志寄存器的
//相關(guān)位查詢。
{
switch(IIR & 0x0e)
{
case 0x04:
a = U0RBR; // 讀取RBR中的數(shù)據(jù),并清除中斷
if(D) //查詢是否進(jìn)入數(shù)傳狀態(tài)
{
if(a=='W')
{
E=1;
LEDS_Flash(4);
}
#ifdef DEBUG //調(diào)試時(shí),將
U0THR = a; // 要發(fā)送的數(shù)據(jù)
while ((U0LSR & 0x20) == 0); //等待發(fā)送完成
#endif
}
else //以下為進(jìn)入GPRS數(shù)傳狀態(tài)后的接收程序,接收到的數(shù)據(jù)由上位機(jī)通過GPRS無線鏈路傳來
{
Beep(1);
LEDS_Flash(1);
U0THR = (a+3); // 將服務(wù)器端發(fā)來的數(shù)值做加3處理。
while ((U0LSR & 0x20) == 0); // 等待發(fā)送完成
}
break;
case 0x06: //串口錯(cuò)誤中斷
k=U0LSR; //任意的一個(gè)讀取U0LSR都可以清除該中斷。
k=U0RBR; //讀出錯(cuò)誤數(shù)據(jù)然后放棄
break;
default:
break;
}
}
VICVectAddr = 0x00; // 中斷處理結(jié)束
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :UART0_Init()
** 函數(shù)功能 :串口初始化,設(shè)置工作模式和波特率。
** 入口參數(shù) :baud 波特率
** set 模式設(shè)置(UARTMODE數(shù)據(jù)結(jié)構(gòu))
** 出口參數(shù) :1-初始化成功, 0-初始化失敗
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UARTMODE set)
{
uint32 bak;
/* 參數(shù)過濾 */
if ((baud ==0 ) || (baud > 115200)) return (0);
if ((set.datab <5) || (set.datab > 8)) return (0);
if ((set.stopb == 0) || (set.stopb > 2)) return (0);
if (set.parity > 4) return (0);
/* 設(shè)置串口波特率 */
U0LCR = 0x80; // DLAB = 1
bak = (Fpclk >> 4) / baud;
U0DLM = bak >> 8;
U0DLL = bak & 0xFF;
/* 設(shè)置串口模式 */
bak = set.datab - 5; // 設(shè)置字長(zhǎng)
if (set.stopb == 2) bak |= 0x04; // 判斷是否為2位停止位
if (set.parity != 0)
{
set.parity = set.parity - 1;
bak |= 0x08;
}
bak |= set.parity << 4; // 設(shè)置奇偶校驗(yàn)
U0LCR = bak;
return (1);
}
void Key_Prosses(unsigned char keyvalue)
{
switch( keyvalue)
{
case KEY1:
while((IO0PIN&KEY1) == 0);//當(dāng)按鍵松開下向上位機(jī)發(fā)送數(shù)傳數(shù)據(jù)
// Sendstr=it[6];
// OSSemPost(Sem_Send);
OSTaskCreate(Task_Getchar, (void *)0, &Task_Getchar[0],Task_Getchar_Prio);
OSTaskCreate(Task_Send, (void *)0, &TaskStk_Send[0],Task_Send_Prio);
break;
case KEY2:
while((IO0PIN&KEY2) == 0);
U0IER = 0x00;
Sendstr=
for (i=7;i<10;i++)
{
UART0_SendStr(in[i]);
DelayNS(200);
}
OSSemPost(Sem_Send);
LEDS_Flash(15)
break;
}
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :main()
*********************************************************************************************************
*/
int main (void)
{
uint8 i,k=5;
UARTMODE set; //設(shè)置串口的格式
set.datab = 8;
set.stopb = 1;
set.parity = 0;
PINSEL0 = (PINSEL0&(~0x0f)|0x05)&(~(0x03<<14)); // 設(shè)置I/O連接到UART0,P0.7(BEEP)為GPIO功能,其它的管腳功能不變
PINSEL1 = PINSEL1&(~0x0f); // 設(shè)置KEY1(P0.16)和KEY2(P0.17)為GPIO功能,其它的管腳功能不變
PINSEL2 = PINSEL2&(~0x08); // P1.18-P1.25為GPIO功能,其它的管腳功能不變
IO1DIR |= LEDS; // P1.18-P1.25為輸出
IO0DIR = IO0DIR&(~KEY1)&(~KEY2)|BEEP; // 設(shè)置BEEP控制口P0.7為輸出模式,KEY1(P0.16)和KEY2(P0.17)為輸入
IO0SET = BEEP; // 控制BEEP(P0.7)輸出高電平1,不峰鳴
IO1SET = LEDS; // LED全滅
UART0_Init(115200, set); // 串口初始化
U0FCR = 0x00; // 禁能FIFO
IRQEnable(); // 使能IRQ中斷
/* 使能UART0中斷 */
VICIntSelect = 0x00000000; // 設(shè)置所有的通道為IRQ中斷
VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高優(yōu)先級(jí)
VICVectAddr0 = (uint32)IRQ_UART0; // 設(shè)置UART0向量地址
VICIntEnable = 1 << 0x06; // 使能UART0中斷
LEDS_Flash(2); //程序開始時(shí),LED閃爍提示
OSInit(); //任務(wù)初始化
OSTaskCreate(Task_Send_GPRSAT, (void *)0, &TaskStk_Send_GPRSAT[0],Task_Send_GPRSAT_Prio);
OSTaskCreate(Task_KeyBoard, (void *)0, &Task_KeyBoard[0],Task_KeyBoard_Prio);
OSStart(); //開始多任務(wù)調(diào)度
/*for (i=0;i<3;i++)
{
Send_GPRSAT();
Beep(1);
while((E==0)&&(k!=0)) //等待接收到Ok_Info_WaitingForData,k用來避免死循環(huán)。
{
DelayNS(300);
k--;
}
if(E)break;
}
if(E)
{
D = 0; //D清零,進(jìn)入數(shù)傳狀態(tài)
while (1) //等待按鍵按下,此處是個(gè)死循環(huán)
{
if((IO0PIN&KEY1) == 0) //如KEY1按下,則向上位機(jī)發(fā)送一串實(shí)驗(yàn)字符
{
DelayNS(1); //軟件延時(shí),去抖動(dòng)
if((IO0PIN&KEY1) == 0)
{
while((IO0PIN&KEY1) == 0);//當(dāng)按鍵松開下向上位機(jī)發(fā)送數(shù)傳數(shù)據(jù)
UART0_SendStr(in[6]);
}
}
else
if((IO0PIN&KEY2) == 0) //入KEY2按下,則退出數(shù)傳狀態(tài)并斷開GPRS連接
{
DelayNS(1); //軟件延時(shí),去抖動(dòng)
if((IO0PIN&KEY2) == 0)
{
while((IO0PIN&KEY2) == 0);
U0IER = 0x00;
for (i=7;i<10;i++)
{
UART0_SendStr(in[i]);
DelayNS(200);
}
LEDS_Flash(15);
}
}
}
}
else
Beep(10); //三次重?fù)芫催M(jìn)入數(shù)傳狀態(tài)則報(bào)警
*/
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
void Task_Send_GPRSAT(void *mydata) reentrant
{
mydata=mydata;
for(;;){
Send_GPRSAT();
Beep(1);
while((E==0)&&(k!=0)) //等待接收到Ok_Info_WaitingForData,k用來避免死循環(huán)。
{
DelayNS(300);
k--;
}
if(E==1)OSTaskDel(Task_Send_GPRSAT_Prio);
}
void Task_Send(void *mydata) reentrant
{mydata=mydata;
for(;;){
UART0_SendStr(*str);
}
}
void Task_Getchar(int *str) reentrant
{mydata=mydata;
for(;;){
Sendstr=in[n];
}
}
void Task_KeyBoard(void *mydata) reentrant
{
mydata=mydata;
for(;;){
if(IO0PIN==0) //如果IO0PIN=0說明有鍵按下
{
Key_Prosses(key);//鍵盤處理子程序,根據(jù)鍵值得不同執(zhí)行的操作
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -