[STC单片机] 单片机与GPRS模块的通信

[复制链接]
674|6
 楼主 | 2019-5-30 09:12 | 显示全部楼层 |阅读模式
单片机怎么存储GPRS模块的AT指令返回的数据,并且怎样可以将数据发送出去

使用特权

评论回复
| 2019-5-30 14:11 | 显示全部楼层
串口接收到的数据放入缓存即可,再对其解析。
怎么发数据可以参考文档啊,上面有详细的使用说明和通讯方案。我一般用透传,模组初始化结束后,进入透传模式后,即可像普通串口一样接收发送数据了。

使用特权

评论回复
 楼主 | 2019-5-30 14:43 | 显示全部楼层
ly1972001 发表于 2019-5-30 14:11
串口接收到的数据放入缓存即可,再对其解析。
怎么发数据可以参考文档啊,上面有详细的使用说明和通讯方案 ...

请问你有没有将串口收到的数据放入缓存并发出去的例程,我对这个不是很了解,谢谢啦

使用特权

评论回复
| 2019-5-30 14:48 | 显示全部楼层
zch305 发表于 2019-5-30 14:43
请问你有没有将串口收到的数据放入缓存并发出去的例程,我对这个不是很了解,谢谢啦 ...

例程很多,比如原子的例程中就有怎么进行串口中断接收。或者网上百度

使用特权

评论回复
 楼主 | 2019-6-1 16:23 | 显示全部楼层
本帖最后由 zch305 于 2019-6-1 16:26 编辑
ly1972001 发表于 2019-5-30 14:48
例程很多,比如原子的例程中就有怎么进行串口中断接收。或者网上百度

下面程序是通过单片机串口发送ALIENTEK@AT+LOC指令并且将返回的位置数据存储到寄存器中再通过串口将位置数据发送到服务器上。用串口助手测试,发送ALIENTEK@AT+LOC,返回这个数据,''+LOCATION: 108.986671,34.247131"   OK。为什么结果是在服务器上接收到的是ALIENTEK@AT+LOC,而不是其返回数据,请你帮忙看看这有什么问题。
#include<reg52.h>
#include<stdio.h>
#include<string.h>

#define uchar unsigned char
#define uint unsigned int

char rcvbuf[20];
char rcvflag = 0;

void delayms(uint x)  //51单片机常用延时程序
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=125;j>0;j--);
}

void uart_init()  //串口初始化
{
        TMOD=0x20;
        TH1=0XFd;
        TL1=0XFd;
        SCON=0x50;
        PCON=0X00;
        TR1=1;
        EA=1;
        ES=1;
}

void GPRS_init()
{
            ES=0;//发送数据时关闭串口接收中断
            TI=1;//发送中断执行清除标志         
        printf("ALIENTEK@AT+LOC\r\n");
                        while(!TI);
                     TI=0;
                                 ES=1;
}  


void send(char *p)
{
        TI=0;
        do
        {        
                SBUF=*p;
                p++;
                while(!TI);
                TI=0;
        }while(*p);
        SBUF=' ';
        while(!TI);
        TI=0;
}

void main()
{
        char buf[20];
        char i;

        uart_init();
        GPRS_init()
                 while(1)
        {
                if(rcvflag == 1)  //判断是否接收到数据
                {
                        ES = 0;
                        rcvflag = 0;
                        for(z=0;z=20;z++)
                {        
                       send1(rcvbuf);
                }
                        z = 0;
                }
        }
}

void uart_rcv() interrupt 4  //中断接收程序
{
        static char i = 0;
        if(RI == 1)
        {
                ES = 0;
                RI = 0;
                rcvbuf[i++] = SBUF;
                if(rcvbuf[i-1] == '\n')  //判断字符串结束位置
                {
                        rcvbuf = '\0';
                        i = 0;
                        rcvflag = 1;  //字符串结束,把接收标志位置1
                }
                ES = 1;
        }         
}

使用特权

评论回复
| 2019-6-10 07:34 | 显示全部楼层
如果要通过GPRS模块传输数据给服务器,是需要一个流程的,不可能只通过一条AT指令就能实现。请务必仔细阅读你所使用的GPRS模块的使用文档。一般来说,会有一个初始化过程,再设置好通讯方式(如透传或TCPIP通讯),才可以进行数据传输。

使用特权

评论回复
| 2019-8-28 15:44 | 显示全部楼层
zch305 发表于 2019-6-1 16:23
下面程序是通过单片机串口发送ALIENTEK@AT+LOC指令并且将返回的位置数据存储到寄存器中再通过串口将位置数 ...

应该是没通讯上  或者条件判断有问题

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

在线客服 快速回复 返回顶部 返回列表