pc机与单片机串口通信问题 利用串口通信助手将一个字符串发给单片机 单片机返回一个字符串到串口通信助手

程序如下:这个程序每次只能返回一个字符,如果我在串口通信助手里输入 Hello,World!
如果按一下发送,那结果返回的就只是H,如果再按一次,那就出现了e,之后再按的话那就是重复H,e出现,麻烦知道的能帮我解答一下,不胜感激......

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
char flag;
char ch[10],a;
int resv = 0 , send = 0;

void main()
{
TMOD = 0X20; //设置中断方式
TH1 = 0XFD; //设置初值以确定波特率
TL1 = 0XFD;
TR1 = 1; //开中断

/*设置SCON寄存器,以确定通信方式*/
SM0 = 0;
SM1 = 1;
REN = 1; //允许接收

EA = 1; //开总中断
ES = 1; //开串口中断
while(1)
{
if(flag==1) //确定是否接收
{
send++;
ES = 0; //关串口中断
flag = 0;
a = ch[send];
SBUF = a; //将收到的数据返回电脑
while(TI!=1);
TI = 0; //TI==1说明发送完毕
ES = 1; //开中断
}
}
}

void chuankou() interrupt 4 //串口中断,当有数据通过串口输入时启动
{ //RI数据接收标志位
//电脑发送给单片机
resv++; //RI==1说明收到数据
RI = 0;
a = SBUF; //取寄存器SBUF的值
ch[resv] = a; //存进一个数组
flag = 1; //标志位,收到数据后置1
}

给你指出几处明显的错误。
1.resv没有最大值的限定,这样你的程序在运行的时候ch[resv]会指向不明地址,因为ch[]最大为10个字节。
2.某种程度上可以认为你的串口接收程序没有错误,但是你的串口接收程序是每次接收到一个字节就设置收到数据标志的,所以你发送数据应该每次发送一个字节。而你每次发送一个字符串,显然和你单片机上写的程序不符,所以会产生不明错误。
3.可能你想要的是每次发送多个字节,也就是一个字符串,然后将这个字符串一起发送到PC上。那你应该在串口中断里面设置一个判断,也就是说,中断里面判断到上位机发送的数据结束后,单片机的串口中断程序才设置标志位,然后根据标志位和接收到数据到数量,把所有的数据一次性发送给PC。
4.指出你出现异常的原因。因为串口在接收到1个字节后,resv=1,也就是ch[1]='H',这个时候标志位被设置,程序进入发送程序,响应的SBUF=a,将H发送出去。因为51单片机仅有一个串口缓存寄存器,这样发送的时候是没有办法接收的,而PC机不知道,还是在发送,也许这样导致的错误。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-23
PC发送是一个字符串连续发送的,单片机在收到第一个字符时,就进入中断,同时置标志。
而你在主程序一检测到标志,立即关中断,接收自然停止了。

解决方法:1. 要同时收发的话,可以直接在中断内区分TI与RI,并写SBUF = a;2. 完全接收后再一并发送。
第2个回答  2012-03-23
问题出在你发送时关掉中断,因为丢掉了数据造成的,解决的办法是:延时一段时间等待接收完毕后再发送,比如检测到有接收数据后,延时10毫秒,之后再发送回PC。
相似回答