跪地求助解决单片机与pc机串口通信问题

程序已经出来但有点小问题,按要求用串口助手给单片机输入go,单片机返回WELCOMECOMETOCHAIN!但是当我输入good是也会返回WELCOMECOMETOCHA... 程序已经出来但有点小问题,按要求用串口助手给单片机输入go,单片机返回WELCOME COME TO CHAIN!但是当我输入good是也会返回WELCOME COME TO CHAIN!问题就在这里,请高手指教,程序如下:/*******************************************************************************************************
*程序功能:
*1.在PC机上使用串口调试软件,向单片机发送字符串, *
*2.当接收指令信号为:'go' , 单片机向PC机发送字符串'WELCOME TO CHINA!'*
*3.当接收指令信号为:'who',单片机向PC机发送字符串'MY NAME IS LIMING'*
*4.当接收指令信号为:'home',单片机向PC机发送字符串'YING YONG KE XUE XUE YUAN'*
*5.这时,串口调试软件就会在窗口显示出相应字符串;如果接送的字符串不正确,单片机不响应 *
********************************************************************************************************/
#include "reg52.h"
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar bur[5],bur1[5],bur2[5],flag0,flag1,flag2;
uchar f[17] = "WELCOME TO CHINA!" ;
uchar g[17] = "MY NAME IS LIming" ;
uchar h[27] = "YING YONG KE XUE XUE YUAN" ;
uchar buf1[3] = "go", buf2[4] = "who", buf3[5]= "home" ; int c,d,e,i,j,k,l;
/*******************************************************
*函数:void delay(void) *
*功能:延时*
********************************************************/
void delay(void)
{
unsigned char a,b;
for(b=200;b>0;b--)
for(a=50;a>0;a--);
}
/**************************************************************************
*函数:void UART_Init(void) *
*功能:串口初始化函数,在系统时钟为11.0592MHZ时,设定串口波特率为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; while(TI==0); TI=0; }
//主函数
void main(void)
{
UART_Init();
while(1)
{flag0=strcmp(buf1,bur) ;
flag1=strcmp(buf2,bur);
flag2=strcmp(buf3,bur);
if (i==2)
{ if (flag0==1)
{i=0; c=0;
for (c=0;c<17;c++)
{ LED=0; delay(); LED=1;Uart_SendData(f[c]); } break;
} }

else if (i==3)
{ if (flag1==0)
{i=0;d=0;
for (d=0;d<17;d++)
{ LED=0; // 当该数据传送时,LED点亮,数据传送完LED灭
delay();
LED=1;
Uart_SendData(g[d]);
} break;
} }
else if(i==4)
{if (flag2==0)
{l=0; e=0;
for (e=0;e<27;e++)
{ LED=0;
delay();LED=1; Uart_SendData( h[e]); } break;
} }} }

void INT_UartRcv(void) interrupt 4
{uchar key;
if(RI)
{
key=SBUF; bur[i] =key;i++;if(i>=4) i=0;
RI = 0; }
}
请写出解决的程序 谢谢
展开
 我来答
kiss13800
2010-07-09 · TA获得超过124个赞
知道答主
回答量:89
采纳率:0%
帮助的人:0
展开全部
问题就出现在中断与返回后程序的执行。串口是发一个字符中断一次,而你发了多个字符就得中断多次,而中断返回后就得执行程序,在返回程序中,你马上比较,可能问题就在这里。
s12j3
2010-07-08 · 超过14用户采纳过TA的回答
知道答主
回答量:41
采纳率:0%
帮助的人:37.4万
展开全部
i的大小本身就是用来判断收到的是那条命令,你还另外用了flag0,flag1,flag2;这三个标志位去判断。
本人觉得可以不用i,直接用三个flag0,flag1,flag2就可以判断是那条命令。
另外你if(i>=4) i=0;只有这一条清零貌似不够,如果函数的某个初始化地方应该再加一个清零吧
感觉有点乱,还是改用一个标志位好吧。这样可以避免错误
另外使用标志位注意什么时候该清零什么时候被置位,这样就不会搞混了
没有调试,希望这些对你有帮助
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
DJ影逸
2010-07-09 · TA获得超过869个赞
知道小有建树答主
回答量:1815
采纳率:0%
帮助的人:583万
展开全部
加上开始结束标识符就行了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ilearnit
2010-07-08 · 超过24用户采纳过TA的回答
知道答主
回答量:94
采纳率:0%
帮助的人:69万
展开全部
加入接受buffer的长度检测
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式