微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机串口的问题

51单片机串口的问题

时间:01-16 来源:互联网 点击:

想问一下:单片机串口在接收的时候是怎么接收的?如上位机一次发送一个字符串11223344,通过串口助手下发给单片机。用下面的程序
/***********************************************************/
/* 串口中断程序 */
/********************************************************/
void UART_SER () interrupt 4
{

uchar Temp; // 定义临时变量

if(RI) // 判断是接收中断产生

{

RI=0; // 标志位清零

Temp=SBUF; // 读入缓冲区的值

P1=Temp; // 把值输出到 P1 口,用于观察

SBUF=Temp; // 把接收到的值再发回电脑端

}

if(TI) // 如果是发送标志位,清零

TI=0;
}

单片机能够把上位机的数据全部接收后原样传输回去
------------------------------------

我修改了一下程序:,把上面的判断改为

if(RI) // 判断是接收中断产生

{

RI=0; // 标志位清零

Temp=SBUF; // 读入缓冲区的值

P1=Temp; // 把值输出到 P1 口,用于观察

SBUF=Temp; // 把接收到的值再发回电脑端

while(!TI);

TI=0;

SBUF='o';

}

即想每次读入缓冲区内容后,送回上位机,然后再送回一个字母o,以此来判断单片机读入缓冲区内容的是每次读一个字节还是能够一次性都读完,运行结果为:

上位机发送11223344,单片机传回的是11223344o
看来单片机每次串口接收终端后,缓冲区中能把全部数据读入,但是SBUF只有一个字节,怎么会能够都读入进来呢?
-------------------------------------
把中断函数里面的内容继续修改为:

if(RI) // 判断是接收中断产生

{

RI=0; // 标志位清零

Temp=SBUF; // 读入缓冲区的值

P1=Temp; // 把值输出到 P1 口,用于观察

SBUF=Temp; // 把接收到的值再发回电脑端

while(!TI);

TI=0;

SBUF='o';

while(!TI);

TI=0;

}
运行结果为:
上位机用串口助手发送11223344,单片机收到后,传回串口助手,内容显示为1o1o2o3o4o
这就不明白了。
上位机发送的数据单片机每次应该只能收到一个字符,然后下一个字符会触发一个新的接收中断,如此经过多次中断处理后才能收到完整的内容,不知道我这么理解是否正确。请指点,谢谢。

NE5532回复:

楼主在犯一个常见错误——在接收中断里面等发送,接收缓冲区溢出了咋办?

楼主:确实如此,但是
RI=0; // 标志位清零

Temp=SBUF; // 读入缓冲区的值

P1=Temp; // 把值输出到 P1 口,用于观察

SBUF=Temp; // 把接收到的值再发回电脑端

while(!TI);

TI=0;

SBUF='o';
怎么就能全部收到11223344,而且最后能加一个字符o

NE5532版主:

在错误的东西基础上研究如何错误没有任何意义,正确只有一种,错误有无数种。你实在要找是怎么错的,可能找得到,但是对解决问题意义不大,用来培养自己熟悉单片机还成。

中断倒不是不能在里面做事,是看在做事的同时,外面还有没有事要做,如果没有,呆里面也没问题。具体问题具体分析,不能胡子眉毛一把抓。总的来说中断服务程序是尽量短。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top