打印
[STC单片机]

单片机与GPRS模块的通信

[复制链接]
1528|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zch305|  楼主 | 2019-5-30 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zch305|  楼主 | 2019-5-30 14:43 | 只看该作者
ly1972001 发表于 2019-5-30 14:11
串口接收到的数据放入缓存即可,再对其解析。
怎么发数据可以参考文档啊,上面有详细的使用说明和通讯方案 ...

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

使用特权

评论回复
板凳
zch305|  楼主 | 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;
        }         
}

使用特权

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

21

帖子

0

粉丝