OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4265|回复: 2

单片机与GPRS模块通信获取位置信息并将其发送出去

[复制链接]

4

主题

6

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-5-28
在线时间
7 小时
发表于 2019-6-4 22:09:19 | 显示全部楼层 |阅读模式
1金钱
有偿请教,有意者加QQ:2591884705。单片机与GPRS模块通信获取位置信息并将其发送出去,帮我看看我下面的程序有什么问题,单片机发送wz@AT+LOC,为什么我在原子云上服务器(GPRS模块指定的接收数据的服务器)直接收到wz@AT+LOC(这是我的在透传状态也能查询位置的指令),并且我之前也用串口助手与GPRS模块相连,测试到从串口助手发送wz@AT+LOC指令,可以返回下面这些数据
AT+LOC

+LOCATION: 108.986671,34.247131

OK
而且我也将单片机与pc连接,通过串口助手,可以看到wz@AT+LOC,证明了单片机串口已经发送了wz@AT+LOC
#include<reg51.h>
#include<stdio.h>
#include<string.h>

#define uchar unsigned char
#define uint unsigned int

char rcvbuf[20];
char rcvflag = 0;
sfr AUXR  = 0x8e;               //辅助寄存器
sfr TH2         =   0xD6;   //0000,0000 T2高字节
sfr TL2        =   0xD7;   //0000,0000 T2低字节
void delayms(uint x)  //51单片机常用延时程序
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=125;j>0;j--);
}

void uart_init()  //串口初始化
{
    SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        TL2 = 0xE8;                //设定定时初值
        TH2 = 0xFF;                //设定定时初值
        AUXR |= 0x10;                //启动定时器2        

}
void SendData(unsigned char ch)
{
    SBUF = ch;                 //写数据到UART数据寄存器
                while(TI == 0);
                TI = 0;
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}
void GPRS()  //wifi初始化,就是往串口发送AT指令
{
        ES=0;
        TI=1;                                 //TI是发送标志位。发送完成,该位置1  ES=0的话 TI 和RI为1,都不会去执行串口中断函数
                   delayms(1200);
           SendString("wz@AT+LOC\r\n");
          delayms(1200);

while(!TI);
        TI=0;
        ES=1;
}



void main()
{
        char buf[20];
        char i;
        uart_init();
        GPRS();
        while(1)
        {
                if(rcvflag == 1)  //判断是否接收到数据
                {
                        ES = 0;
                        rcvflag = 0;
                        for(i=0;i<20;i++)
                           
                           {
                           SendString(rcvbuf);
                            }                                
                        i = 0;
                        ES = 1;
                }

        }
}

void uart_rcv() interrupt 4  //中断接收程序
{
        static char i = 0;
        if(RI == 1)
        {
                ES = 0;                //ES是中断允许位
                RI = 0;           //RI是接收标志位,接收完成,该位置1,跟 ES没直接关系
                rcvbuf[i++] = SBUF;
                if(rcvbuf[i-1] == '\n')  //判断字符串结束位置                \n是换行符,通常在输出中用作格式控制;\n'就是一个转义字符,其意义是“回车换行”
                {
                        rcvbuf = '\0';                 //         字符串结束的标志
                        i = 0;
                        rcvflag = 1;  //字符串结束,把接收标志位置1
                }
                ES = 1;
        }         
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10542
金钱
10542
注册时间
2017-2-18
在线时间
1908 小时
发表于 2019-6-5 10:03:45 | 显示全部楼层
回复

使用道具 举报

4

主题

6

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-5-28
在线时间
7 小时
 楼主| 发表于 2019-6-5 10:37:21 | 显示全部楼层

大佬,有没有看出啥问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 22:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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