用GPRS模块和51单片机进行通信时的问题 20
我用51单片机和GPRS通信,然后用电脑来接受GPRS模块的信息。结果发过来的都是乱码。我想知道一下是如何发送AT指令的,不是一个一个发吗?voidmain(){init...
我用51单片机和GPRS通信,然后用电脑来接受GPRS模块的信息。结果发过来的都是乱码。我想知道一下是如何发送AT指令的,不是一个一个发吗?
void main()
{
init();
for(i=0;i<10;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
delay(10);
}
这样发过去却都是乱码 。
我没有用中断来接受,因为用的是电脑来接受 真的不明白 求大神指点 展开
void main()
{
init();
for(i=0;i<10;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
delay(10);
}
这样发过去却都是乱码 。
我没有用中断来接受,因为用的是电脑来接受 真的不明白 求大神指点 展开
展开全部
你串口怎么接的? 如果是并在单片机与GPRS模块直接的话,电脑的串口应该只能手动模块回传的信息,收不到单片机的。因为RX TX 反接要!乱码可能是波特率问题!你先用电脑去收你单片机发过来的数据,看看AT指令对不对。 给你我的程序参考下,调试通过的额
/***********************************************************
***********************************************************/
//#include "stc15.h" //包含STC15单片机寄存器定义文件
#include "STC15F2K.h"
//#include "LCD12864.H"
#include <intrins.H>
typedef unsigned char unint8;
typedef unsigned char unint16;
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define SEND "AT+CMGS=\"电话号码\"\r\n"
unsigned char qwh;
sbit buzzer = P0^6;
sbit relay = P0^4;
sbit key=P3^2;
void delay(uchar t,uchar y)
{
uint i,j;
for(i=0;i<y;i++)
for(j=0;j<t;j++);
}
void InitUART(void)
{ //9600bps@11.0592MHz
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1;
ES = 1; //使能串口中断
EA = 1;
}
void SendData(uchar dat)
{
//while (busy_ck); //等待前面的数据发送完成
//busy_ck = 1;
SBUF = dat; //写数据到UART数据寄存器
while(TI==0);
TI=0;
}
/*----------------------------
发送字符串
----------------------------*/
void SendString(uchar *s)
{
while (*s) //检测字符串结束标志
{
SendData(*s++); //发送当前字符
}
}
/****************************************************************************/
void fs(void)
{
int i;
SendString("AT+CMGF=1\r\n"); //m模式设置
for(i=0;i<50;i++)
delay(8888,8888);
SendString(SEND); //电话号码 在顶部定义的
for(i=0;i<50;i++)
delay(8888,88888);
SendString("Warning! Someone broke into the house!\r\n"); //短信内容
for(i=0;i<50;i++)
delay(8888,8888);
SendData(0x1a); //结束符
}
void main(void)
{
int flage=0,i=0,j=0;
InitUART();
while(1)
{
relay = 0;
P2 = 0xA0;
P2 = 0x00;
if(key==1&&flage==0)
{
//P1=0XFF;
relay = 1;
P2 = 0xA0;
P2 = 0x00;
fs();
flage=1;
}
if(flage==1)
{
P1=0XFF;
}
delay(8888,8888);
i++;
if(i>=500)
{
flage=0;
i=0;
}
}
}
void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI = 0; //Clear receive interrupt flag
//a[pi]= SBUF; //P0 show UART data
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
}
// pi++;
}
/***********************************************************
***********************************************************/
//#include "stc15.h" //包含STC15单片机寄存器定义文件
#include "STC15F2K.h"
//#include "LCD12864.H"
#include <intrins.H>
typedef unsigned char unint8;
typedef unsigned char unint16;
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define SEND "AT+CMGS=\"电话号码\"\r\n"
unsigned char qwh;
sbit buzzer = P0^6;
sbit relay = P0^4;
sbit key=P3^2;
void delay(uchar t,uchar y)
{
uint i,j;
for(i=0;i<y;i++)
for(j=0;j<t;j++);
}
void InitUART(void)
{ //9600bps@11.0592MHz
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1;
ES = 1; //使能串口中断
EA = 1;
}
void SendData(uchar dat)
{
//while (busy_ck); //等待前面的数据发送完成
//busy_ck = 1;
SBUF = dat; //写数据到UART数据寄存器
while(TI==0);
TI=0;
}
/*----------------------------
发送字符串
----------------------------*/
void SendString(uchar *s)
{
while (*s) //检测字符串结束标志
{
SendData(*s++); //发送当前字符
}
}
/****************************************************************************/
void fs(void)
{
int i;
SendString("AT+CMGF=1\r\n"); //m模式设置
for(i=0;i<50;i++)
delay(8888,8888);
SendString(SEND); //电话号码 在顶部定义的
for(i=0;i<50;i++)
delay(8888,88888);
SendString("Warning! Someone broke into the house!\r\n"); //短信内容
for(i=0;i<50;i++)
delay(8888,8888);
SendData(0x1a); //结束符
}
void main(void)
{
int flage=0,i=0,j=0;
InitUART();
while(1)
{
relay = 0;
P2 = 0xA0;
P2 = 0x00;
if(key==1&&flage==0)
{
//P1=0XFF;
relay = 1;
P2 = 0xA0;
P2 = 0x00;
fs();
flage=1;
}
if(flage==1)
{
P1=0XFF;
}
delay(8888,8888);
i++;
if(i>=500)
{
flage=0;
i=0;
}
}
}
void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI = 0; //Clear receive interrupt flag
//a[pi]= SBUF; //P0 show UART data
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
}
// pi++;
}
追问
用单片机传数据到GPRS的RX 再用PL2303的RX接到GPRS的TX就可以用单片机发送数据用电脑接受数据吧。。。。。。。可是发出去都是乱码 我的GPRS模块是115200波特率的 我用的52的定时器2来产生的波特率 应该不会是波特率错误吧.....
追答
可以不使用PL2303吧 你的GPRS模块就是TTL电平的吧 直接接上就可以了。STC下载工具有生成波特率的工具。你先确定你单片机发的指令时正确的,用电脑的串口助手去调试一下
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询