搜索
bottom↓
回复: 14

正在做毕设,大家能不能发个GTM900的例程上来~~~

[复制链接]

出0入0汤圆

发表于 2011-6-15 10:11:04 | 显示全部楼层 |阅读模式
正在做毕设,900的资料基本已经看完,但是关于初始化,数据打包等问题不知该如何下手。用的900的朋友们,请您帮个忙,发个小的例程让我看看~~谢谢大家的帮助~~~~

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2011-6-15 10:23:44 | 显示全部楼层
在线等!请大家帮帮忙~~~我的PCB已经做出来了  单片机的程序也基本完成了~~~现在就差900这块的程序了~~~谢谢大家了~~~

出0入0汤圆

发表于 2011-6-15 10:57:46 | 显示全部楼层
你可以在论坛里搜一下
或者看看 appcat的帖子,可能会有相关的

出0入0汤圆

发表于 2011-6-15 11:32:49 | 显示全部楼层
现在都基本答辩完了吧,莫非楼主明年毕业,哈哈

出0入0汤圆

发表于 2011-6-15 12:53:21 | 显示全部楼层
同求。。。。在做一个项目,AT命令控制GTM900C,没看到什么例程就自己写了,发送个AT+xxxx神马的。。。然后收一大堆AT+xxx...然后和已经定义好的数组比一样不一样。。。。但是似乎不太可行。。。我这边对比玩了黄花菜都凉了。。。看有51的例程似乎就比几个字母就确定是否正确了。。。
小弟做的是STM32+GTM9000C通过GPRS发送数据,求大神指导下吧。。。自己乱搞出来的东西感觉乱七八糟的。。。。大神指导下程序结构应怎么写什么的。。。。灰常感谢。。。

出0入0汤圆

发表于 2011-6-15 13:52:14 | 显示全部楼层
有等的功夫仔细看AT指令集吧,什么问题都解决了

出0入0汤圆

发表于 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做的,坛子里面例程多得是,自己搜索一下吧!!

出0入0汤圆

 楼主| 发表于 2011-6-16 08:31:06 | 显示全部楼层
回复【6楼】qjs412
-----------------------------------------------------------------------

谢谢您了~~~嘿嘿

出0入12汤圆

发表于 2011-6-16 09:04:54 | 显示全部楼层
楼主 GTM900的模块哪里搞来的,有木有便宜又好用的介绍1下

出0入0汤圆

 楼主| 发表于 2011-6-16 10:00:08 | 显示全部楼层
回复【8楼】skynet 青青草原
-----------------------------------------------------------------------

我们老师提供的模块,不过我在淘宝上查过,好像不贵~~~不过在有的论坛上网友说900已经下线了~~~你可以再找找啊~~~

出0入0汤圆

发表于 2011-6-16 10:11:21 | 显示全部楼层
有便宜又好用的啊,W801G

出0入0汤圆

发表于 2011-11-25 16:12:20 | 显示全部楼层
6楼的例程很给力丫~收下了~

出0入0汤圆

发表于 2012-8-5 11:09:35 | 显示全部楼层
那程序怎么不用输入 中心信息号跟 目的电话号码呢?

出0入0汤圆

发表于 2012-8-5 20:08:33 | 显示全部楼层
那段AT命令不是挺简单的吗?~~!我原来发过一个贴,有可以借鉴的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 08:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表