新手上路
- 积分
- 23
- 金钱
- 23
- 注册时间
- 2019-5-28
- 在线时间
- 7 小时
|
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;
}
}
|
|