|
发表于 2011-6-15 15:02:11
|
显示全部楼层
#include "config.h"
#include "stdio.h"
#include "string.h"
#define set_pwon {PINSEL0 &= 0XFFFFCFFF; IO0DIR |= 0X00000040; IO0SET |= 0X00000040;}//置高PWON
#define clr_pwon {PINSEL0 &= 0XFFFFCFFF; IO0DIR |= 0X00000040; IO0CLR |= 0X00000040;}//拉低PWON
#define SERIAL_BUF_SIZE 0x200 //定义串口缓冲区的大小
#define FALSE 0
#define TRUE 1
#define uint8 unsigned char
#define int8 char
#define uint16 unsigned int
#define int16 int
char nCmdEcho = FALSE;
char szSerialBuf0[SERIAL_BUF_SIZE]; //定义串口0的缓冲区
char szSerialBuf1[SERIAL_BUF_SIZE]; //定义串口1的缓冲区
uint32 nCntRcvd0 = 0; //记录串口0的接受个数
uint32 nCntRcvd1 = 0; //记录串口1的接受个数
//延时函数使用定时器0的0号匹配通道,最小延时间隔为1毫秒
void delay(uint32 millisec)
{
T0TC = 0; /* 定时器设置为0 */
T0PR = 0; /* 时钟不分频 */
T0MCR = 0x07; /* 设置T0MR0匹配后复位T0TC,并产生中断标志,定时时间到后,定时器停止工作 */
T0MR0 = (uint32)(1.0 * Fpclk * millisec / 1000.0);/*先乘后除,减小误差;转换成浮点数计算,防止寄存器溢出*/
T0TCR = 0x01; /* 启动定时器 */
while ((T0IR & 0x01) == 0); /* 等待定时时间到,结束延时 */
T0IR = 0x01; /* 清除中断标志 */
}
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
//结束等待
void end_delay()
{
T0TC = 0; /* 定时器设置为0 */
T0PR = 0; /* 时钟不分频 */
T0MCR = 0x07; /* 设置T0MR0匹配后复位T0TC,并产生中断标志,定时时间到后,定时器停止工作 */
T0MR0 = 0;
T0TCR = 0x01; /* 启动定时器 */
}
//---------------------------------------------------------------------------------------
//
void UART0_Init(uint32 baud)
{
uint16 Fdiv;
PINSEL0 |= 0x00000005; //连接引脚
U0LCR = 0x83; //串口0工作在1个起始位,8个数据位,1停止位,无校验的模式下
Fdiv = (Fpclk / 16) / baud;
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
U0FCR = 0x01; // 使能FIFO,并设置触发点为1字节
U0IER = 0x01; // 允许RBR中断,即接收中断
}
//---------------------------------------------------------------------------------------
void UART0_SendByte(uint8 data)
{
U0THR = data;
while ((U0LSR & 0x40) == 0);
}
void UART0_SendStr(char *str)
{
while (*str != '\0')
UART0_SendByte(*str++);
}
void UART1_Init(uint32 baud)
{
uint16 Fdiv;
PINSEL0 |= 0x00050000; //连接引脚
U1LCR = 0x83; //串口1工作在1个起始位,8个数据位,1停止位,无校验的模式下
Fdiv = (Fpclk / 16) / baud;
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03;
U1FCR = 0x01; // 使能FIFO,并设置触发点为1字节
U1IER = 0x01; // 允许RBR中断,即接收中断
}
void UART1_SendByte(uint8 data)
{
U1THR = data;
while ((U1LSR & 0x40) == 0);
}
void UART1_SendStr(char *str)
{
while (*str != '\0')
UART1_SendByte(*str++);
}
//---------------------------------------------------------------------------------------
//-------------------------------串口0中断处理函数---------------------------------------
void __irq IRQ_UART0 (void)
{
if ((U0IIR & 0x0F) == 0x04)
{
szSerialBuf0[nCntRcvd0++] = U0RBR;
if (nCntRcvd0 == SERIAL_BUF_SIZE)
nCntRcvd0 = 0;
szSerialBuf0[nCntRcvd0] = '\0';
}
VICVectAddr = 0x00; // 中断处理结束
}
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
//-------------------------------串口1中断处理函数---------------------------------------
void __irq IRQ_UART1 (void)
{
if ((U1IIR & 0x0F) == 0x04)
{
szSerialBuf1[nCntRcvd1++] = U1RBR;
if (nCntRcvd1 == SERIAL_BUF_SIZE)
nCntRcvd1 = 0;
szSerialBuf1[nCntRcvd1] = '\0';
}
VICVectAddr = 0x00; // 中断处理结束
}
void ConfigIRQ()
{
IRQEnable(); // 使能IRQ中断
VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断
/*
VICVectCntl0 = 0x20 | 0x0D; // RTC分配到IRQ slot0,即最高优先级
VICVectAddr0 = (uint32)IRQ_RTC; // 设置RTC向量地址
VICIntEnable |= 0x00002000; // 使能RTC中断
*/
VICVectCntl1 = 0x20 | 0x06; // UART0分配到IRQ slot1,即第二优先级
VICVectAddr1 = (uint32)IRQ_UART0; // 设置UART0向量地址
VICIntEnable |= 1<<0x06; // 使能UART0中断
VICVectCntl2 = 0x20 | 0x07; // UART1分配到IRQ slot2,即第三优先级
VICVectAddr2 = (uint32)IRQ_UART1; // 设置UART1向量地址
VICIntEnable |= 1<<0x07; // 使能UART1中断
}
void Start_GTM(void)
{
set_pwon;
delay(10);
clr_pwon;
delay(60);
set_pwon;
}
void Stop_GTM(void)
{
clr_pwon;
delay(1000);delay(1000);delay(1000);
set_pwon;
}
void Send_AT(int8* AT_Command,uint16 cnt,uint16 number) //发送AT命令,cnt为等待一次AT执行结果返回的时间,number为AT发送的次数
//发送成功跳出,发送失败重新启动
{
uint8 i,j;
uint32 _cnt;
int8 szTmp[SERIAL_BUF_SIZE];
_cnt = cnt / 100;
if(0 == _cnt)
_cnt = 1;
for(j = 0;j < number;j++)
{
memset(szTmp, 0, sizeof(szTmp));
nCmdEcho = FALSE;
nCntRcvd1 = 0;
UART1_SendStr(AT_Command);
for (i = 0; i<_cnt; i++)
{
delay(100);
if (nCntRcvd1 < 4)
continue;
if ((szSerialBuf1[nCntRcvd1 - 1] == '\n')
&& (szSerialBuf1[nCntRcvd1 - 2] == '\r')
&& ((szSerialBuf1[nCntRcvd1 - 3] == 'K') || (szSerialBuf1[nCntRcvd1 - 3] == 'R'))
&& (szSerialBuf1[nCntRcvd1 - 4] == 'O')
)
{
if (szSerialBuf1[nCntRcvd1 - 3] == 'K')
{
nCmdEcho = TRUE;
}
else if (szSerialBuf1[nCntRcvd1 - 3] == 'R')
{
nCmdEcho = FALSE;
}
break;
}
}
if(nCmdEcho == TRUE)
break; //如果执行结果为OK,则结束循环
}
if(nCmdEcho == FALSE)
((void (*)(void))0x0)();
}
/*void Send_SMS(char* Send_Info, int _Info_Length)//发送短信,发送失败,复位PC
{
unsigned int i =0;
char Info_Length[30];
char szTmp[SERIAL_BUF_SIZE];
memset(szTmp, 0, sizeof(szTmp));
nCmdEcho = FALSE;
sprintf(Info_Length,"AT+CMGS=%d\r\n",_Info_Length);
UART0_SendStr("发送短信\r\n");
do
{
nCntRcvd1 = 0;
UART1_SendStr(Info_Length);
delay(100);
if (nCntRcvd1!=0)
{
char j;
sscanf(szSerialBuf1, "%s", szTmp);
//UART0_SendStr(szTmp);
//UART0_SendStr("\r\n");
if (strcmp(szTmp, ">") == 0)
{ UART0_SendStr("发送短信......\r\n");
nCntRcvd1 = 0;
memset(szTmp, 0, sizeof(szTmp));
UART1_SendStr(Send_Info);
UART1_SendByte(0x1a);
for (j = 0; j<20; j++)
{
delay(1500);
if (nCntRcvd1 >= 4)
{
if ((szSerialBuf1[nCntRcvd1 - 1] == '\n')
&& (szSerialBuf1[nCntRcvd1 - 2] == '\r')
&& ((szSerialBuf1[nCntRcvd1 - 3] == 'K') || (szSerialBuf1[nCntRcvd1 - 3] == 'R'))
&& (szSerialBuf1[nCntRcvd1 - 4] == 'O')
)
{
if (szSerialBuf1[nCntRcvd1 - 3] == 'K')
{
nCmdEcho = TRUE;
}
else if (szSerialBuf1[nCntRcvd1 - 3] == 'R')
{
nCmdEcho = FALSE;
}
}
}
}
}
}
//delay(100);
i++;
if (i>1000)
{
Stop_GTM();
((void (*)(void))0x0)();
}
}while (nCmdEcho == FALSE);
}*/
void GTM_Init() //初始化GTM900C,关闭回显,设置短信格式为PDU
{
char AT_Com[100];
UART0_SendStr("关闭回显\r\n");
strcpy(AT_Com, "ATE0\r\n");
Send_AT(AT_Com,200,300);
UART0_SendStr("设置格式TXT\r\n");
strcpy(AT_Com, "AT+CMGF=1\r\n");
Send_AT(AT_Com,200,300);
UART0_SendStr("收到短信,直接给出短信内容\r\n");
strcpy(AT_Com, "AT+CNMI=2,2\r\n");
Send_AT(AT_Com,200,300);
UART0_SendStr("读出指定位置的短信内容\r\n");
strcpy(AT_Com, "AT+CMGR=1\r\n");
UART1_SendStr(AT_Com);
//nCntRcvd1 = 0;//delay(200);
//while(nCntRcvd1 < 4);
}
int main (void)
{
char Info[0x200];
ConfigIRQ();
Start_GTM();
//delay(3000);
UART0_Init(9600);
UART1_Init(9600);
GTM_Init();
//strcpy(Info, "0891683108200505F011000B815158505319F20008A7044F60597D\r\n");
//Send_SMS(Info,18);
//UART0_SendStr("发送成功\r\n");
nCntRcvd1 = 0;
while(1)
if(nCntRcvd1 >= 4)
{
strcpy(Info,szSerialBuf1);
UART0_SendStr(Info);
nCntRcvd1 = 0;
}
return 0;
}
我已经试过,程序没问题
之前用LPC2132做的,坛子里面例程多得是,自己搜索一下吧!! |
|