用串口调试助手给单片机发送一串字符串,单片机接受完之后向串口助手回显,出现了个神奇的问题,求助

源程序:#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit D0=P1^0;
uchar flag;
uchar a[30];
uint y, u,c;

/*发送子程序*/
void fasong(uchar dat)
{
while(TI==0)
{
SBUF=dat;
}
TI=0;
}

/*延时子程序*/
void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<250;j++);
}
}

/*主程序*/
void main()
{

SM0=0;//选择工作方式一
SM1=1;
TR1=1;
REN=1;
TMOD=0X20;//设置定时器1为工作方式2
TH1=0XFD;
TL1=0XFD;//设置波特率为9600
EA=1;//开CPU中断
ES=1;//开串行口中断

delay(1000);
D0=0;
while(1)
{
while(flag)
{
y=0;
while(a[y]!='\0')
{
fasong(a[y]);
a[y]='\0'; //清空字符,方便下次接收
y++;
}
y=0;
flag=0; }
}
}

void jsfs() interrupt 4
{
c=0;
u=1000;
ES=0;
while(u--) //一直接收 直到字符串接收完毕
{
while(RI)
{
a[c]=SBUF;
c++;
RI=0;
u=1000;
}
}
ES=1;
flag=1;
}
结果如图 为啥会出现字符重复显示的现象 求解
结果

发送函数中,这样写,防止TI还未来得及置为1,就一直在发送,这样写可防止上述情况
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit D0=P1^0;
uchar flag;
uchar a[30];
uint y, u,c;

/*发送子程序*/
void fasong(uchar dat)
{

ES=0;
SBUF=dat;
while(!TI);
TI=0;
ES=1;
}

/*延时子程序*/
void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<250;j++);
}
}

/*主程序*/
void main()
{

SM0=0;//选择工作方式一
SM1=1;
TR1=1;
REN=1;
TMOD=0X20;//设置定时器1为工作方式2
TH1=0XFD;
TL1=0XFD;//设置波特率为9600
EA=1;//开CPU中断
ES=1;//开串行口中断

delay(1000);
D0=0;
while(1)
{
while(flag)
{
y=0;
while(a[y]!='\0')
{
fasong(a[y]);
a[y]='\0'; //清空字符,方便下次接收
y++;
}
y=0;
flag=0; }
}
}

void jsfs() interrupt 4
{
c=0;
u=1000;
ES=0;
while(u--) //一直接收 直到字符串接收完毕
{
while(RI)
{
a[c]=SBUF;
c++;
RI=0;
u=1000;
}
}
ES=1;
flag=1;
}追问

为什么会来不及置1呢 对于时序这块我不是很懂 另外 如果将ES关闭 还能发送出去吗 谢谢 刚才试过了 还是会重复发送

追答

发送的时候将中断关闭,发送完以后又打开了,发送数据和中断是否打开无关,发送完数据,TI被硬件置为1,但是这需要时间,单片机处理语句速度很快,你用了while循环,肯定会重复发送,TI为1时会触发中断,所以发送以前将中断关闭,防止触发中断。我试了一下,不会重复的。看图:

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-03
发送子程序修改如下:
/*发送子程序*/
void fasong(uchar dat)
{
SBUF=dat;
while(TI==0)
{
_nop_; }
TI=0;
}

用串口调试助手给单片机发送一串字符串,单片机接受完之后向串口助手回显...
用串口调试助手给单片机发送一串字符串,单片机接受完之后向串口助手回显,出现了个神奇的问题,求助 10 源程序:#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit D0=P1^0; uchar flag; uchar a[30]; uint y, u,c; \/*发送子程序*\/ void fasong(uchar dat) { while(TI==...

...蓝牙模块发送后蓝牙串口调试助手上显示的就不对了
一种可能是波特率误差大了,可以降低波特率试试看,或者不降低到其它波特率,但把发送波特率故意调慢5%~10%先看看现象

...当关闭单片机电源瞬间,串口调试助手会多显示一个数子00,这是怎么...
这个问题不是太好解决,可以归结为干扰的原因,在单片机上电和断电的瞬间都可能出现,因为单片机和计算机通讯用的串口协议中,是没有握手信号DSR和DTR的,只有RXD和TXD,所以很难避免这种由于电源不稳(上电时的充电和断电时的放电)造成的干扰。

串口调试助手发数据单片机接收不对
串口中断函数中应避免有使用串口发送的语句SBUF=xx,这样容易产生嵌套中断,或者使程序发生错误,我想可能是中断函数的问题导致你接收错误

单片机发送的数据在串口调试助手接收正常,但是在linux下接收出现乱码...
3、在windows中使用串口调试助手设置同单片机串口相同的参数,查看接受数据是否正确。如果不正确,说明是单片机串口参数设置的问题,或者是时钟频率的问题。如果正确,说明一定是linux端的问题。如果是linux端的问题,主要从两个方面解决,一个是参数设置,一个是信息读取。下面是测试方法。4linux端查看一下...

想用单片机接受从串口调试助手那里发送过来的数值数据,如何写代码(C...
\/\/ 单片机串行口发送\/接收程序,每接收到字节即发送出去 \/\/ 和微机相接后键入的字符回显示在屏幕上 \/\/ 可用此程序测试 \/\/ include <reg51.h> define XTAL 11059200 \/\/ CUP 晶振频率 define baudrate 9600 \/\/ 通信波特率 void main(void){ unsigned char c;TMOD = 0x20; \/\/ 定时...

利用LabVIEW的串口通信,为什么上位机发送一个字符串,而单片机只接收到前...
我做过labvIEW的编程,我做的是USB通讯,首先你可以用串口调试助手发送一串字符,看下位机是否接收正常,如果不正常,那么就一定是你的程序出错;如果一切正常,那么你再看labvIEW的发送命令程序,因为发送的时候应该是字符串格式(看你的描述),那么你要确定字符串的长度,如果有buffer的话还要确定它的...

串口调试助手怎么发送数据在接收区显示
首先,单片机里面要有程序。 然后,电脑串口的参数要与单片机一致。例:9600,N,8,1. (9600波特率,无校验,8个数据位,1个停止位)。 最后,点:“打开串口”。当单片机有数据发送时,PC电脑就能显示数据。 注意显示格式:如果单片机是按16进制发送,则PC也要设为16进制显示。

51单片机串口接收单字符后如何进行判断
如果在串口助手上发送字符数据 那么在单片机上接收的就可以用该字符对应的十六进制码进行判断 比如你的数据 0,以字符形式发送0,换成十六进制就是 30 单片机用0x表示十六进制数据,所以就是 0x30 判断语句如下 if ( c==0x30 ){ LED = ~LED; } 具体的字符与十六进制码对换,可以参考下表 ...

用串口调试助手向单片机发送数据,单片机怎么接受并储存到一个数组中
校验方式可自行选择。如果数据不是很重要,定义一个132字节接收队列(全局变量数组),如果数据很重要,定义两个132字节接收队列,一个做接收缓冲,接受正确才更新正式队列。还要定义一个接收指针,当接收到帧头标志,接收指针清零,以后每接收一个字符,以接收指针做下标将数据存入接收数组。

相似回答