GSM模块通过232与PC机通信测试完全正常,单片机通过232与PC上的串口助手调试也完全正常。但是单片机与GSM模块通信时就不能通信了(直通线),我不知道是软件的问题还是电平的问题,已经困扰我1周了,希望各位大虾能帮我看看。在此表示由衷的谢谢!
测试结果:P0=0X0F0口是8个LED
程序如下:
#include<regx52.h>
#include<intrins.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define RxIn 67
sbit start=P0^3;
sbit ceshi=P0^4;
uchar code AT[]="AT";
uchar code OK[]="OK";
uchar code ATD[]="ATD13408681235;";
uchar code ATS0[]="ATS0=3";
uchar code ATNOS[]="AT$NOSLEEP=1";
uchar idata SystemBuf[RxIn]; //储存出口接收数据
uchar Rx=0,flag1=0;
uint flag=0,count=0;
void Delay_ms(uint i);
void sendchar(uchar ch);
void sendstring(uchar *p);
void GSM_INIT(void);
void Start_GSM();
void UART_init (void);
main()
{
Start_GSM();
UART_init();
GSM_INIT();
while(1)
{
if(flag1)
flag1=0;
P0=0X0F;
}
}
/*************串口初始*******************/
void UART_init (void)
{
TMOD=0x20; //方式控制字
TH1=0xfd; //设置波特率为9600
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
/*************启动*******************/
void Start_GSM()
{
start=0;
Delay_ms(500);
start=1;
Delay_ms(1000);
}
/******************************************************************************************************************/
////////////////////////////////函数void Delay_ms(uint i);实现功能:进行毫秒延时///////////////////////////////////
/******************************************************************************************************************/
void Delay_ms(uint i)
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
/******************************************************************************************************************/
//////////////////////函数void sendchar(uchar ch);实现功能:发送一字节数据//////////////////////////////////////////
/******************************************************************************************************************/
void sendchar(uchar ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
/******************************************************************************************************************/
//////////////////////函数void sendstring(uchar *p);实现功能:通过串口发送字符串/////////////////////////////////////
/******************************************************************************************************************/
void sendstring(uchar *p)
{
while(*p)
{
sendchar(*p);
p++;
}
sendchar(0x0D);
sendchar(0x0A);
}
/******************************************************************************************************************/
///////////////////函数void receive(void) interrupt 4 using 1;实现功能:通过串口接收数据///////////////////////////////
/******************************************************************************************************************/
void receive(void) interrupt 4 using 1
{
if(RI)
{
if(Rx<RxIn)
{
SystemBuf[Rx]=SBUF;
Rx++;
}
RI=0;
}
}
/*************清楚缓冲区*******************/
void clearbuffer(void)//清除缓冲区
{ uchar cl;
for(cl=0;cl<RxIn;cl++)
{
SystemBuf[cl]=0x00;
}
Rx=0;
}
/******************************************************************************************************************/
///////////////////函数void GSM_INIT(void);实现功能:初始化GSM模块///////////////////////////////
/******************************************************************************************************************/
void GSM_INIT(void)
{
LOOP:
// Delay_ms(1000);
// sendstring(AT);
Delay_ms(1000);
sendstring(ATNOS);
Delay_ms(1000);
sendstring(ATS0);
Delay_ms(1000);
// sendstring(ATD);
//Delay_ms(1000);
// sendstring(ATE);
// Delay_ms(1000);
// sendstring(AT_CNMI);
// Delay_ms(1000);
// sendstring(AT_CSCA);
// Delay_ms(1000);
// for(Rx=0;Rx<RxIn;Rx++)
// {
// SystemBuf[Rx]=0x00;
// }
// Rx=0;
// sendstring(AT_CMGF);
// Delay_ms(1000);
if(SystemBuf[0]=='O'&&SystemBuf[1]=='K') //判断是否模块初始化成功,成功的话模块会回复"OK"给单片机
{
EA=0; //如果单片机没有收到OK,就继续发送初始化指令/
clearbuffer();
flag1=1;
}
else
{
clearbuffer();
goto LOOP;
}
} |
|