请大侠们帮我看看这个程序哪里出了错,关于单片机串口与pc通信问题

小弟我的财富值只有28分所以只能给20分了,如果哪位大侠给小弟解决了这个问题小弟感激不尽!硬件 STC89C52RC+MAX232设计要求:在PC机上使用串口调试软件,向单片机发送字符串,当接收指令信号为:’go’ , 单片机向PC机发送字符串‘WELCOME TO CHINA!’,当接收指令信号为:’who’,单片机向PC机发送字符串‘MY NAME IS LIMING’,当接收指令信号为:’home’,单片机向PC机发送字符串‘YINGYONGKEXUEXUEYUAN’,这时,串口调试软件就会在窗口显示出相应字符串;如果接送的字符串不正确,单片机不响应。
程序如下:
#include "reg52.h"
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar Rcv[],bur[];
uchar f[17] = "WELCOME TO CHINA!" ;
uchar g[17] = "MY NAME IS LIMING" ;
uchar h[22] = "YINGYONGKEXUEXUEYUAN" ;
uchar buf1[5] = "go", buf2[5] = "who", buf3[5]= "home" ;
int c,d,e,i;
void delay(void)
{
unsigned char a,b;
for(b=200;b>0;b--)
for(a=50;a>0;a--);
}
/**************************************************************************
*函数:void UART_Init(void) *
*功能:串口初始化函数,在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s *
*说明:串口接收中断允许,发送中断禁止 *
***************************************************************************/
void UART_Init(void)
{
SCON = 0x50 ; //UART 工作模式1,REN=1
TMOD |= 0x20 ; //timer 1, 工作于模式 2
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFA ; //波特9600 晶振为11.0592MHz
ES=1;
TR1 = 1 ; // 启动 timer 1
EA=1;
}

void Uart_SendData(uchar dat)
{
SBUF=dat; //写SBUF,开始发送
while(TI==0); //等待发送
TI=0; //清发送标志位
}
//主函数
void main(void)
{
UART_Init(); //串口初始化

while(1)
{

}
}
/*******************************************************
*函数:INT_UartRcv() *
*功能:串口接收中断函数 *
*说明:中断号为 4 *
********************************************************/
void INT_UartRcv(void) interrupt 4
{
if(RI)
{
for (i=0; i<4; i++)
{
while (!RI);
bur[i] = SBUF;
RI = 0;
}
}
c=strncmp(bur,buf1,2 );
d=strncmp(bur,buf2,3 );
e=strncmp(bur,buf3,4 );
for (c=0;c<17;c++)
{ Rcv[17]= f[c] ;
LED=0;
delay();
LED=1; i=0;
Uart_SendData(Rcv[17]);}
for (d=0;d<17;d++)
{ Rcv[17]= g[d] ; LED=0;
delay();
LED=1; i=0;
Uart_SendData(Rcv[17]);}
for (e=0;e<22;e++)
{ Rcv[22]= h[e] ;
LED=0;
delay();
LED=1; i=0;
Uart_SendData(Rcv[22]);
}
}

调试结果是:用串口调试助手输入两个字符(如gg)时串口不向pc及发送任何数据,而且再输入任何数据不工作,纵有再关闭一次串口调试助手,再输入任何大于两字符长度的字符串(如ggg)串口调试助手显示WELCOME TO CHINA!MY NAME IS LIMINGYINGYONGKEXUEXUEYUAN

程序第六行, 改成这样
uchar Rcv[5],bur[5]; /* 要给空间的 */
------------------------------------------------------

程序第十行, 改成这样
uchar buf1[5] = "og", buf2[5] = "ohw", buf3[5]= "emoh" ;

------------------------------------------------------
最后一个副程序 INT_UartRcv(void) , 改成这样

void INT_UartRcv(void) interrupt 4
{
bur[4]=bur[3];
bur[3]=bur[2];
bur[2]=bur[1];
bur[1]=bur[0];

if(RI)
{
bur[0] = SBUF;
RI = 0;
}

c=strncmp(bur,buf1,2 );
d=strncmp(bur,buf2,3 );
e=strncmp(bur,buf3,4 );

if( c != 0 )
for (c=0;c<17;c++)
{ Rcv[0]= f[c] ;
LED=0;
delay();
LED=1; i=0;
Uart_SendData(Rcv[0]);
}

if( d != 0 )
for (d=0;d<17;d++)
{ Rcv[0]= g[d] ;
LED=0;
delay();
LED=1;
i=0;
Uart_SendData(Rcv[0]);
}

if( e != 0 )
for (e=0;e<22;e++)
{ Rcv[0]= h[e] ;
LED=0;
delay();
LED=1;
i=0;
Uart_SendData(Rcv[0]);
}
}

==========================================================================
To batsong : 你的代码如果可以, 太阳就从西边出来啦
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-27
void INT_UartRcv(void) interrupt 4
{
if(RI) --收到一字节,即进入本中断函数
{ --这个字节(如g),没有处理,就进入下面的循环?
for (i=0; i<4; i++)
{
while (!RI);--持续等待接受四次,而主机,并没有发送这么多,
--单片机就死在这里了
bur[i] = SBUF;
RI = 0;
}
第2个回答  2010-06-27
Acetsai1971的代码有问题,每次中断数组向后移动,并把收到的写buf[0],这样收到的串在数组中是反序的,strncmp根本比较不出来。
这个代码太粗糙,你试试看吧
void INT_UartRcv(void) interrupt 4
{

if(RI)
{
bur[i] = SBUF;
RI = 0;
i++;
}

c=strncmp(bur,buf1,2 );
d=strncmp(bur,buf2,3 );
e=strncmp(bur,buf3,4 );

if( c == 1 )
for (c=0;c<17;c++)
{ Rcv[0]= f[c] ;
LED=0;
delay();
LED=1; i=0;
Uart_SendData(Rcv[0]);
}

if( d == 1 )
for (d=0;d<17;d++)
{ Rcv[0]= g[d] ;
LED=0;
delay();
LED=1;
i=0;
Uart_SendData(Rcv[0]);
}

if( e == 1 )
for (e=0;e<22;e++)
{ Rcv[0]= h[e] ;
LED=0;
delay();
LED=1;
i=0;
Uart_SendData(Rcv[0]);
}

if(i>4)i=0;
}
相似回答